Commit 597db13e authored by Linus Torvalds's avatar Linus Torvalds

Merge bk://linuxusb.bkbits.net/linus-2.5

into penguin.transmeta.com:/home/penguin/torvalds/repositories/kernel/linux
parents c1d630b5 d348f4e3
......@@ -1914,13 +1914,13 @@ S: Santa Clara, CA 95052
S: USA
N: Petko Manolov
E: petkan@dce.bg
D: USB ethernet (pegasus) driver
E: petkan@users.sourceforge.net
D: USB ethernet pegasus/pegasus-II driver
D: optimizing i[45]86 string routines
D: i386 task swithing hacks
S: 5, Vrah Mancho str.
S: 1324 Sofia
S: Bulgaria
D: i386 task switching hacks
S: 482 Shadowgraph Dr.
S: San Jose, CA 95110
S: USA
N: Martin Mares
E: mj@ucw.cz
......
......@@ -1657,7 +1657,7 @@ S: Maintained
USB PEGASUS DRIVER
P: Petko Manolov
M: petkan@dce.bg
M: petkan@users.sourceforge.net
L: linux-usb-users@lists.sourceforge.net
L: linux-usb-devel@lists.sourceforge.net
S: Maintained
......
......@@ -170,6 +170,18 @@ CONFIG_USB_AUDIO
The module will be called audio.o. If you want to compile it as a
module, say M here and read <file:Documentation/modules.txt>.
CONFIG_USB_EMI26
This driver loads firmware to Emagic EMI 2|6 low latency USB
Audio interface.
After firmware load the device is handled with standard linux
USB Audio driver.
This code is also available as a module ( = code which can be
inserted in and removed from the running kernel whenever you want).
The module will be called audio.o. If you want to compile it as a
module, say M here and read <file:Documentation/modules.txt>.
CONFIG_USB_ACM
This driver supports USB modems and ISDN adapters which support the
Communication Device Class Abstract Control Model interface.
......@@ -316,12 +328,12 @@ CONFIG_USB_VICAM
module, say M here and read <file:Documentation/modules.txt>.
CONFIG_USB_PEGASUS
Say Y here if you know you have Pegasus or Pegasus II based adapter.
Say Y here if you know you have Pegasus or Pegasus-II based adapter.
If in doubt then look at linux/drivers/usb/pegasus.h for the complete
list of supported devices.
If your particular adapter is not in the list and you are _sure_ it
is Pegasus or Pegasus II based then send me (pmanolov@lnxw.com) vendor
and device IDs.
is Pegasus or Pegasus II based then send me (pmanolov@users.sourceforge.net)
vendor and device IDs.
This code is also available as a module ( = code which can be
inserted in and removed from the running kernel whenever you want).
......
......@@ -31,6 +31,7 @@ if [ "$CONFIG_USB" = "y" -o "$CONFIG_USB" = "m" ]; then
comment 'USB Device Class drivers'
dep_tristate ' USB Audio support' CONFIG_USB_AUDIO $CONFIG_USB $CONFIG_SOUND
dep_tristate ' EMI 2|6 USB Audio interface support' CONFIG_USB_EMI26 $CONFIG_USB_AUDIO
dep_tristate ' USB Bluetooth support (EXPERIMENTAL)' CONFIG_USB_BLUETOOTH $CONFIG_USB $CONFIG_EXPERIMENTAL
if [ "$CONFIG_SCSI" = "n" ]; then
comment ' SCSI support is needed for USB Storage'
......@@ -86,7 +87,7 @@ if [ "$CONFIG_USB" = "y" -o "$CONFIG_USB" = "m" ]; then
if [ "$CONFIG_NET" = "n" ]; then
comment ' Networking support is needed for USB Networking device support'
else
dep_tristate ' USB ADMtek Pegasus-based ethernet device support (EXPERIMENTAL)' CONFIG_USB_PEGASUS $CONFIG_USB $CONFIG_NET $CONFIG_EXPERIMENTAL
dep_tristate ' USB Pegasus/Pegasus-II based ethernet device support (EXPERIMENTAL)' CONFIG_USB_PEGASUS $CONFIG_USB $CONFIG_NET $CONFIG_EXPERIMENTAL
dep_tristate ' USB KLSI KL5USB101-based ethernet device support (EXPERIMENTAL)' CONFIG_USB_KAWETH $CONFIG_USB $CONFIG_NET $CONFIG_EXPERIMENTAL
dep_tristate ' USB CATC NetMate-based Ethernet device support (EXPERIMENTAL)' CONFIG_USB_CATC $CONFIG_USB $CONFIG_NET $CONFIG_EXPERIMENTAL
dep_tristate ' USB Communication Class Ethernet device support (EXPERIMENTAL)' CONFIG_USB_CDCETHER $CONFIG_USB $CONFIG_NET $CONFIG_EXPERIMENTAL
......
......@@ -63,6 +63,7 @@ obj-$(CONFIG_USB_SCANNER) += scanner.o
obj-$(CONFIG_USB_ACM) += acm.o
obj-$(CONFIG_USB_PRINTER) += printer.o
obj-$(CONFIG_USB_AUDIO) += audio.o
obj-$(CONFIG_USB_EMI26) += emi26.o
obj-$(CONFIG_USB_IBMCAM) += ibmcam.o usbvideo.o ultracam.o
obj-$(CONFIG_USB_KONICAWC) += konicawc.o usbvideo.o
obj-$(CONFIG_USB_PWC) += pwc.o
......
/*
* Emagic EMI 2|6 usb audio interface firmware loader.
* Copyright (C) 2002
* Tapio Laxstrm (tapio.laxstrom@iptime.fi)
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License, as published by
* the Free Software Foundation, version 2.
*
* emi26.c,v 1.13 2002/03/08 13:10:26 tapio Exp
*/
#include <linux/kernel.h>
#include <linux/errno.h>
#include <linux/slab.h>
#include <linux/module.h>
#include <linux/usb.h>
#define MAX_INTEL_HEX_RECORD_LENGTH 16
typedef struct _INTEL_HEX_RECORD
{
__u32 length;
__u32 address;
__u32 type;
__u8 data[MAX_INTEL_HEX_RECORD_LENGTH];
} INTEL_HEX_RECORD, *PINTEL_HEX_RECORD;
/* include firmware (variables) */
#include "emi26_fw.h"
#define EMI26_VENDOR_ID 0x086a /* Emagic Soft-und Hardware GmBH */
#define EMI26_PRODUCT_ID 0x0100 /* EMI 2|6 without firmware */
#define ANCHOR_LOAD_INTERNAL 0xA0 /* Vendor specific request code for Anchor Upload/Download (This one is implemented in the core) */
#define ANCHOR_LOAD_EXTERNAL 0xA3 /* This command is not implemented in the core. Requires firmware */
#define ANCHOR_LOAD_FPGA 0xA5 /* This command is not implemented in the core. Requires firmware. Emagic extension */
#define MAX_INTERNAL_ADDRESS 0x1B3F /* This is the highest internal RAM address for the AN2131Q */
#define CPUCS_REG 0x7F92 /* EZ-USB Control and Status Register. Bit 0 controls 8051 reset */
#define INTERNAL_RAM(address) (address <= MAX_INTERNAL_ADDRESS)
static int emi26_writememory( struct usb_device *dev, int address, unsigned char *data, int length, __u8 bRequest);
static int emi26_set_reset(struct usb_device *dev, unsigned char reset_bit);
static int emi26_load_firmware (struct usb_device *dev);
static void *emi26_probe(struct usb_device *dev, unsigned int if_num, const struct usb_device_id *id);
static void emi26_disconnect(struct usb_device *dev, void *drv_context);
static int __init emi26_init (void);
static void __exit emi26_exit (void);
/* thanks to drivers/usb/serial/keyspan_pda.c code */
static int emi26_writememory (struct usb_device *dev, int address, unsigned char *data, int length, __u8 request)
{
int result;
unsigned char *buffer = kmalloc (length, GFP_KERNEL);
if (!buffer) {
printk(KERN_ERR "emi26: kmalloc(%d) failed.", length);
return -ENOMEM;
}
memcpy (buffer, data, length);
/* Note: usb_control_msg returns negative value on error or length of the
* data that was written! */
result = usb_control_msg (dev, usb_sndctrlpipe(dev, 0), request, 0x40, address, 0, buffer, length, 300);
kfree (buffer);
return result;
}
/* thanks to drivers/usb/serial/keyspan_pda.c code */
static int emi26_set_reset (struct usb_device *dev, unsigned char reset_bit)
{
int response;
printk(KERN_INFO "%s - %d", __FUNCTION__, reset_bit);
/* printk(KERN_DEBUG "%s - %d", __FUNCTION__, reset_bit); */
response = emi26_writememory (dev, CPUCS_REG, &reset_bit, 1, 0xa0);
if (response < 0) {
printk(KERN_ERR "emi26: set_reset (%d) failed", reset_bit);
}
return response;
}
static int emi26_load_firmware (struct usb_device *dev)
{
int err;
int i;
int pos = 0; /* Position in hex record */
__u32 addr; /* Address to write */
__u8 buf[1023];
/* Assert reset (stop the CPU in the EMI) */
err = emi26_set_reset(dev,1);
if (err < 0) {
printk(KERN_ERR "%s - error loading firmware: error = %d", __FUNCTION__, err);
return err;
}
/* 1. We need to put the loader for the FPGA into the EZ-USB */
for (i=0; g_Loader[i].type == 0; i++) {
err = emi26_writememory(dev, g_Loader[i].address, g_Loader[i].data, g_Loader[i].length, ANCHOR_LOAD_INTERNAL);
if (err < 0) {
printk(KERN_ERR "%s - error loading firmware: error = %d", __FUNCTION__, err);
return err;
}
}
/* De-assert reset (let the CPU run) */
err = emi26_set_reset(dev,0);
/* 2. We upload the FPGA firmware into the EMI
* Note: collect up to 1023 (yes!) bytes and send them with
* a single request. This is _much_ faster! */
do {
i = 0;
addr = g_bitstream[pos].address;
/* intel hex records are terminated with type 0 element */
while ((g_bitstream[pos].type == 0) && (i + g_bitstream[pos].length < sizeof(buf))) {
memcpy(buf + i, g_bitstream[pos].data, g_bitstream[pos].length);
i += g_bitstream[pos].length;
pos++;
}
err = emi26_writememory(dev, addr, buf, i, ANCHOR_LOAD_FPGA);
if (err < 0) {
printk(KERN_ERR "%s - error loading firmware: error = %d", __FUNCTION__, err);
return err;
}
} while (i > 0);
/* Assert reset (stop the CPU in the EMI) */
err = emi26_set_reset(dev,1);
if (err < 0) {
printk(KERN_ERR "%s - error loading firmware: error = %d", __FUNCTION__, err);
return err;
}
/* 3. We need to put the loader for the firmware into the EZ-USB (again...) */
for (i=0; g_Loader[i].type == 0; i++) {
err = emi26_writememory(dev, g_Loader[i].address, g_Loader[i].data, g_Loader[i].length, ANCHOR_LOAD_INTERNAL);
if (err < 0) {
printk(KERN_ERR "%s - error loading firmware: error = %d", __FUNCTION__, err);
return err;
}
}
/* De-assert reset (let the CPU run) */
err = emi26_set_reset(dev,0);
if (err < 0) {
printk(KERN_ERR "%s - error loading firmware: error = %d", __FUNCTION__, err);
return err;
}
/* 4. We put the part of the firmware that lies in the external RAM into the EZ-USB */
for (i=0; g_Firmware[i].type == 0; i++) {
if (!INTERNAL_RAM(g_Firmware[i].address)) {
err = emi26_writememory(dev, g_Firmware[i].address, g_Firmware[i].data, g_Firmware[i].length, ANCHOR_LOAD_EXTERNAL);
if (err < 0) {
printk(KERN_ERR "%s - error loading firmware: error = %d", __FUNCTION__, err);
return err;
}
}
}
/* Assert reset (stop the CPU in the EMI) */
err = emi26_set_reset(dev,1);
if (err < 0) {
printk(KERN_ERR "%s - error loading firmware: error = %d", __FUNCTION__, err);
return err;
}
for (i=0; g_Firmware[i].type == 0; i++) {
if (INTERNAL_RAM(g_Firmware[i].address)) {
err = emi26_writememory(dev, g_Firmware[i].address, g_Firmware[i].data, g_Firmware[i].length, ANCHOR_LOAD_INTERNAL);
if (err < 0) {
printk(KERN_ERR "%s - error loading firmware: error = %d", __FUNCTION__, err);
return err;
}
}
}
/* De-assert reset (let the CPU run) */
err = emi26_set_reset(dev,0);
if (err < 0) {
printk(KERN_ERR "%s - error loading firmware: error = %d", __FUNCTION__, err);
return err;
}
/* return 1 to fail the driver inialization
* and give real driver change to load */
return 1;
}
static __devinitdata struct usb_device_id id_table [] = {
{ USB_DEVICE(EMI26_VENDOR_ID, EMI26_PRODUCT_ID) },
{ } /* Terminating entry */
};
MODULE_DEVICE_TABLE (usb, id_table);
static void * emi26_probe(struct usb_device *dev, unsigned int if_num, const struct usb_device_id *id)
{
printk(KERN_INFO "%s start", __FUNCTION__);
if((dev->descriptor.idVendor == EMI26_VENDOR_ID) && (dev->descriptor.idProduct == EMI26_PRODUCT_ID)) {
emi26_load_firmware(dev);
}
/* do not return the driver context, let real audio driver do that */
return 0;
}
static void emi26_disconnect(struct usb_device *dev, void *drv_context)
{
}
struct usb_driver emi26_driver = {
name: "emi26 - firmware loader",
probe: emi26_probe,
disconnect: emi26_disconnect,
id_table: NULL,
};
static int __init emi26_init (void)
{
usb_register (&emi26_driver);
return 0;
}
static void __exit emi26_exit (void)
{
usb_deregister (&emi26_driver);
}
module_init(emi26_init);
module_exit(emi26_exit);
MODULE_AUTHOR("tapio laxstrm");
MODULE_DESCRIPTION("Emagic EMI 2|6 firmware loader.");
MODULE_LICENSE("GPL");
/* vi:ai:syntax=c:sw=8:ts=8:tw=80
*/
This diff is collapsed.
......@@ -464,12 +464,16 @@ static inline int reset_mac( pegasus_t *pegasus )
if ( i == REG_TIMEOUT )
return 1;
if ( usb_dev_id[pegasus->dev_index].vendor == VENDOR_LINKSYS ||
usb_dev_id[pegasus->dev_index].vendor == VENDOR_DLINK ) {
if (usb_dev_id[pegasus->dev_index].vendor == VENDOR_LINKSYS ||
usb_dev_id[pegasus->dev_index].vendor == VENDOR_DLINK) {
__u16 auxmode;
read_mii_word( pegasus, 0, MII_TPISTATUS, &auxmode );
write_mii_word( pegasus, 0, MII_TPISTATUS, auxmode | 4 );
read_mii_word(pegasus, 1, MII_TPISTATUS, &auxmode);
write_mii_word(pegasus, 1, MII_TPISTATUS, auxmode | 4);
}
if (usb_dev_id[pegasus->dev_index].vendor == VENDOR_ELCON) {
__u16 auxmode;
read_mii_word(pegasus, 3, 0x1b, &auxmode);
write_mii_word(pegasus, 3, 0x1b, auxmode | 4);
}
return 0;
......
......@@ -66,7 +66,6 @@
#define PEGASUS_REQ_GET_REGS 0xf0
#define PEGASUS_REQ_SET_REGS 0xf1
#define PEGASUS_REQ_SET_REG PEGASUS_REQ_SET_REGS
#define ALIGN(x) x __attribute__((aligned(L1_CACHE_BYTES)))
enum pegasus_registers {
EthCtrl0 = 0,
......@@ -103,9 +102,9 @@ typedef struct pegasus {
struct usb_ctrlrequest dr;
wait_queue_head_t ctrl_wait;
struct semaphore ctrl_sem;
unsigned char ALIGN(rx_buff[PEGASUS_MAX_MTU]);
unsigned char ALIGN(tx_buff[PEGASUS_MAX_MTU]);
unsigned char ALIGN(intr_buff[8]);
unsigned char rx_buff[PEGASUS_MAX_MTU];
unsigned char tx_buff[PEGASUS_MAX_MTU];
unsigned char intr_buff[8];
__u8 eth_regs[4];
__u8 phy;
__u8 gpio_res;
......@@ -129,6 +128,7 @@ struct usb_eth_dev {
#define VENDOR_COMPAQ 0x049f
#define VENDOR_COREGA 0x07aa
#define VENDOR_DLINK 0x2001
#define VENDOR_ELCON 0x0db7
#define VENDOR_ELSA 0x05cc
#define VENDOR_HAWKING 0x0e66
#define VENDOR_IODATA 0x04bb
......@@ -208,6 +208,8 @@ PEGASUS_DEV( "D-Link DSB-650TX(PNA)", VENDOR_DLINK, 0x4003,
DEFAULT_GPIO_RESET | HAS_HOME_PNA )
PEGASUS_DEV( "D-Link DSB-650", VENDOR_DLINK, 0xabc1,
DEFAULT_GPIO_RESET )
PEGASUS_DEV( "ELCON EPLC10Mi USB to Powerline Adapter", VENDOR_ELCON, 0x0002,
DEFAULT_GPIO_RESET | PEGASUS_II | HAS_HOME_PNA )
PEGASUS_DEV( "Elsa Micolink USB2Ethernet", VENDOR_ELSA, 0x3000,
DEFAULT_GPIO_RESET )
PEGASUS_DEV( "Hawking UF100 10/100 Ethernet", VENDOR_HAWKING, 0x400c,
......
......@@ -2,7 +2,7 @@
* Edgeport USB Serial Converter driver
*
* Copyright(c) 2000 Inside Out Networks, All rights reserved.
* Copyright(c) 2001 Greg Kroah-Hartman <greg@kroah.com>
* Copyright(c) 2001-2002 Greg Kroah-Hartman <greg@kroah.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
......@@ -25,6 +25,9 @@
*
* Version history:
*
* 2.3 2002_03_08 greg kroah-hartman
* - fixed bug when multiple devices were attached at the same time.
*
* 2.2 2001_11_14 greg kroah-hartman
* - fixed bug in edge_close that kept the port from being used more
* than once.
......@@ -1438,8 +1441,8 @@ static void send_more_port_data(struct edgeport_serial *edge_serial, struct edge
edge_port->write_in_progress = FALSE;
return;
}
buffer[0] = IOSP_BUILD_DATA_HDR1 (edge_port->port->number, count);
buffer[1] = IOSP_BUILD_DATA_HDR2 (edge_port->port->number, count);
buffer[0] = IOSP_BUILD_DATA_HDR1 (edge_port->port->number - edge_port->port->serial->minor, count);
buffer[1] = IOSP_BUILD_DATA_HDR2 (edge_port->port->number - edge_port->port->serial->minor, count);
/* now copy our data */
bytesleft = fifo->size - fifo->tail;
......@@ -2436,7 +2439,9 @@ static int send_iosp_ext_cmd (struct edgeport_port *edge_port, __u8 command, __u
currentCommand = buffer;
MAKE_CMD_EXT_CMD( &currentCommand, &length, edge_port->port->number, command, param);
MAKE_CMD_EXT_CMD (&currentCommand, &length,
edge_port->port->number - edge_port->port->serial->minor,
command, param);
status = write_cmd_usb (edge_port, buffer, length);
if (status) {
......@@ -2516,9 +2521,9 @@ static int send_cmd_write_baud_rate (struct edgeport_port *edge_port, int baudRa
int cmdLen = 0;
int divisor;
int status;
unsigned char number = edge_port->port->number;
unsigned char number = edge_port->port->number - edge_port->port->serial->minor;
dbg(__FUNCTION__" - port = %d, baud = %d", number, baudRate);
dbg(__FUNCTION__" - port = %d, baud = %d", edge_port->port->number, baudRate);
status = calc_baud_rate_divisor (baudRate, &divisor);
if (status) {
......@@ -2621,7 +2626,9 @@ static int send_cmd_write_uart_register (struct edgeport_port *edge_port, __u8 r
currCmd = cmdBuffer;
// Build a cmd in the buffer to write the given register
MAKE_CMD_WRITE_REG(&currCmd, &cmdLen, edge_port->port->number, regNum, regValue);
MAKE_CMD_WRITE_REG (&currCmd, &cmdLen,
edge_port->port->number - edge_port->port->serial->minor,
regNum, regValue);
status = write_cmd_usb(edge_port, cmdBuffer, cmdLen);
if (status) {
......
......@@ -9,6 +9,16 @@
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* (8/3/2002) ganesh
* The ipaq sometimes emits a '\0' before the CLIENT string. At this
* point of time, the ppp ldisc is not yet attached to the tty, so
* n_tty echoes "^ " to the ipaq, which messes up the chat. In 2.5.6-pre2
* this causes a panic because echo_char() tries to sleep in interrupt
* context.
* The fix is to tell the upper layers that this is a raw device so that
* echoing is suppressed. Thanks to Lyle Lindholm for a detailed bug
* report.
*
* (25/2/2002) ganesh
* Added support for the HP Jornada 548 and 568. Completely untested.
* Thanks to info from Heath Robinson and Arieh Davidoff.
......@@ -148,6 +158,8 @@ static int ipaq_open(struct usb_serial_port *port, struct file *filp)
*/
port->tty->low_latency = 1;
port->tty->raw = 1;
port->tty->real_raw = 1;
/*
* Lose the small buffers usbserial provides. Make larger ones.
......
......@@ -2614,7 +2614,7 @@ static void __exit usb_exit(void)
usb_hub_cleanup();
}
module_init(usb_init);
subsys_initcall(usb_init);
module_exit(usb_exit);
/*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment