mirror of
https://github.com/torvalds/linux.git
synced 2024-11-24 05:02:12 +00:00
Automatic merge of rsync://rsync.kernel.org/pub/scm/linux/kernel/git/gregkh/usb-2.6.git/
This commit is contained in:
commit
e6600d800f
@ -431,7 +431,7 @@ nomem:
|
||||
* (2) error, where io->status is a negative errno value. The number
|
||||
* of io->bytes transferred before the error is usually less
|
||||
* than requested, and can be nonzero.
|
||||
* (3) cancelation, a type of error with status -ECONNRESET that
|
||||
* (3) cancellation, a type of error with status -ECONNRESET that
|
||||
* is initiated by usb_sg_cancel().
|
||||
*
|
||||
* When this function returns, all memory allocated through usb_sg_init() or
|
||||
@ -1282,7 +1282,7 @@ static void release_interface(struct device *dev)
|
||||
* bus rwsem; usb device driver probe() methods cannot use this routine.
|
||||
*
|
||||
* Returns zero on success, or else the status code returned by the
|
||||
* underlying call that failed. On succesful completion, each interface
|
||||
* underlying call that failed. On successful completion, each interface
|
||||
* in the original device configuration has been destroyed, and each one
|
||||
* in the new configuration has been probed by all relevant usb device
|
||||
* drivers currently known to the kernel.
|
||||
|
@ -121,7 +121,7 @@ struct urb * usb_get_urb(struct urb *urb)
|
||||
* describing that request to the USB subsystem. Request completion will
|
||||
* be indicated later, asynchronously, by calling the completion handler.
|
||||
* The three types of completion are success, error, and unlink
|
||||
* (a software-induced fault, also called "request cancelation").
|
||||
* (a software-induced fault, also called "request cancellation").
|
||||
*
|
||||
* URBs may be submitted in interrupt context.
|
||||
*
|
||||
@ -170,7 +170,7 @@ struct urb * usb_get_urb(struct urb *urb)
|
||||
* As of Linux 2.6, all USB endpoint transfer queues support depths greater
|
||||
* than one. This was previously a HCD-specific behavior, except for ISO
|
||||
* transfers. Non-isochronous endpoint queues are inactive during cleanup
|
||||
* after faults (transfer errors or cancelation).
|
||||
* after faults (transfer errors or cancellation).
|
||||
*
|
||||
* Reserved Bandwidth Transfers:
|
||||
*
|
||||
@ -395,7 +395,7 @@ int usb_submit_urb(struct urb *urb, int mem_flags)
|
||||
*
|
||||
* This routine cancels an in-progress request. URBs complete only
|
||||
* once per submission, and may be canceled only once per submission.
|
||||
* Successful cancelation means the requests's completion handler will
|
||||
* Successful cancellation means the requests's completion handler will
|
||||
* be called with a status code indicating that the request has been
|
||||
* canceled (rather than any other code) and will quickly be removed
|
||||
* from host controller data structures.
|
||||
|
@ -569,7 +569,7 @@ static const struct usb_cdc_ether_desc ether_desc = {
|
||||
|
||||
/* include the status endpoint if we can, even where it's optional.
|
||||
* use wMaxPacketSize big enough to fit CDC_NOTIFY_SPEED_CHANGE in one
|
||||
* packet, to simplify cancelation; and a big transfer interval, to
|
||||
* packet, to simplify cancellation; and a big transfer interval, to
|
||||
* waste less bandwidth.
|
||||
*
|
||||
* some drivers (like Linux 2.4 cdc-ether!) "need" it to exist even
|
||||
|
@ -275,7 +275,7 @@ static const char *CHIP;
|
||||
*
|
||||
* After opening, configure non-control endpoints. Then use normal
|
||||
* stream read() and write() requests; and maybe ioctl() to get more
|
||||
* precise FIFO status when recovering from cancelation.
|
||||
* precise FIFO status when recovering from cancellation.
|
||||
*/
|
||||
|
||||
static void epio_complete (struct usb_ep *ep, struct usb_request *req)
|
||||
|
@ -705,7 +705,7 @@ void nuke(struct lh7a40x_ep *ep, int status)
|
||||
done(ep, req, status);
|
||||
}
|
||||
|
||||
/* Disable IRQ if EP is enabled (has decriptor) */
|
||||
/* Disable IRQ if EP is enabled (has descriptor) */
|
||||
if (ep->desc)
|
||||
pio_irq_disable(ep_index(ep));
|
||||
}
|
||||
|
@ -240,7 +240,7 @@ struct gs_dev {
|
||||
struct usb_ep *dev_notify_ep; /* address of notify endpoint */
|
||||
struct usb_ep *dev_in_ep; /* address of in endpoint */
|
||||
struct usb_ep *dev_out_ep; /* address of out endpoint */
|
||||
struct usb_endpoint_descriptor /* desciptor of notify ep */
|
||||
struct usb_endpoint_descriptor /* descriptor of notify ep */
|
||||
*dev_notify_ep_desc;
|
||||
struct usb_endpoint_descriptor /* descriptor of in endpoint */
|
||||
*dev_in_ep_desc;
|
||||
|
@ -346,6 +346,22 @@ ehci_reboot (struct notifier_block *self, unsigned long code, void *null)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void ehci_port_power (struct ehci_hcd *ehci, int is_on)
|
||||
{
|
||||
unsigned port;
|
||||
|
||||
if (!HCS_PPC (ehci->hcs_params))
|
||||
return;
|
||||
|
||||
ehci_dbg (ehci, "...power%s ports...\n", is_on ? "up" : "down");
|
||||
for (port = HCS_N_PORTS (ehci->hcs_params); port > 0; )
|
||||
(void) ehci_hub_control(ehci_to_hcd(ehci),
|
||||
is_on ? SetPortFeature : ClearPortFeature,
|
||||
USB_PORT_FEAT_POWER,
|
||||
port--, NULL, 0);
|
||||
msleep(20);
|
||||
}
|
||||
|
||||
|
||||
/* called by khubd or root hub init threads */
|
||||
|
||||
@ -362,8 +378,10 @@ static int ehci_hc_reset (struct usb_hcd *hcd)
|
||||
dbg_hcs_params (ehci, "reset");
|
||||
dbg_hcc_params (ehci, "reset");
|
||||
|
||||
/* cache this readonly data; minimize chip reads */
|
||||
ehci->hcs_params = readl (&ehci->caps->hcs_params);
|
||||
|
||||
#ifdef CONFIG_PCI
|
||||
/* EHCI 0.96 and later may have "extended capabilities" */
|
||||
if (hcd->self.controller->bus == &pci_bus_type) {
|
||||
struct pci_dev *pdev = to_pci_dev(hcd->self.controller);
|
||||
|
||||
@ -383,9 +401,30 @@ static int ehci_hc_reset (struct usb_hcd *hcd)
|
||||
break;
|
||||
}
|
||||
|
||||
/* optional debug port, normally in the first BAR */
|
||||
temp = pci_find_capability (pdev, 0x0a);
|
||||
if (temp) {
|
||||
pci_read_config_dword(pdev, temp, &temp);
|
||||
temp >>= 16;
|
||||
if ((temp & (3 << 13)) == (1 << 13)) {
|
||||
temp &= 0x1fff;
|
||||
ehci->debug = hcd->regs + temp;
|
||||
temp = readl (&ehci->debug->control);
|
||||
ehci_info (ehci, "debug port %d%s\n",
|
||||
HCS_DEBUG_PORT(ehci->hcs_params),
|
||||
(temp & DBGP_ENABLED)
|
||||
? " IN USE"
|
||||
: "");
|
||||
if (!(temp & DBGP_ENABLED))
|
||||
ehci->debug = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
temp = HCC_EXT_CAPS (readl (&ehci->caps->hcc_params));
|
||||
} else
|
||||
temp = 0;
|
||||
|
||||
/* EHCI 0.96 and later may have "extended capabilities" */
|
||||
while (temp && count--) {
|
||||
u32 cap;
|
||||
|
||||
@ -414,8 +453,7 @@ static int ehci_hc_reset (struct usb_hcd *hcd)
|
||||
ehci_reset (ehci);
|
||||
#endif
|
||||
|
||||
/* cache this readonly data; minimize PCI reads */
|
||||
ehci->hcs_params = readl (&ehci->caps->hcs_params);
|
||||
ehci_port_power (ehci, 0);
|
||||
|
||||
/* at least the Genesys GL880S needs fixup here */
|
||||
temp = HCS_N_CC(ehci->hcs_params) * HCS_N_PCC(ehci->hcs_params);
|
||||
@ -657,16 +695,11 @@ done2:
|
||||
static void ehci_stop (struct usb_hcd *hcd)
|
||||
{
|
||||
struct ehci_hcd *ehci = hcd_to_ehci (hcd);
|
||||
u8 rh_ports, port;
|
||||
|
||||
ehci_dbg (ehci, "stop\n");
|
||||
|
||||
/* Turn off port power on all root hub ports. */
|
||||
rh_ports = HCS_N_PORTS (ehci->hcs_params);
|
||||
for (port = 1; port <= rh_ports; port++)
|
||||
(void) ehci_hub_control(hcd,
|
||||
ClearPortFeature, USB_PORT_FEAT_POWER,
|
||||
port, NULL, 0);
|
||||
ehci_port_power (ehci, 0);
|
||||
|
||||
/* no more interrupts ... */
|
||||
del_timer_sync (&ehci->watchdog);
|
||||
@ -748,7 +781,6 @@ static int ehci_resume (struct usb_hcd *hcd)
|
||||
unsigned port;
|
||||
struct usb_device *root = hcd->self.root_hub;
|
||||
int retval = -EINVAL;
|
||||
int powerup = 0;
|
||||
|
||||
// maybe restore (PCI) FLADJ
|
||||
|
||||
@ -766,8 +798,6 @@ static int ehci_resume (struct usb_hcd *hcd)
|
||||
up (&hcd->self.root_hub->serialize);
|
||||
break;
|
||||
}
|
||||
if ((status & PORT_POWER) == 0)
|
||||
powerup = 1;
|
||||
if (!root->children [port])
|
||||
continue;
|
||||
dbg_port (ehci, __FUNCTION__, port + 1, status);
|
||||
@ -794,16 +824,9 @@ static int ehci_resume (struct usb_hcd *hcd)
|
||||
retval = ehci_start (hcd);
|
||||
|
||||
/* here we "know" root ports should always stay powered;
|
||||
* but some controllers may lost all power.
|
||||
* but some controllers may lose all power.
|
||||
*/
|
||||
if (powerup) {
|
||||
ehci_dbg (ehci, "...powerup ports...\n");
|
||||
for (port = HCS_N_PORTS (ehci->hcs_params); port > 0; )
|
||||
(void) ehci_hub_control(hcd,
|
||||
SetPortFeature, USB_PORT_FEAT_POWER,
|
||||
port--, NULL, 0);
|
||||
msleep(20);
|
||||
}
|
||||
ehci_port_power (ehci, 1);
|
||||
}
|
||||
|
||||
return retval;
|
||||
|
@ -281,6 +281,8 @@ ehci_hub_descriptor (
|
||||
temp = 0x0008; /* per-port overcurrent reporting */
|
||||
if (HCS_PPC (ehci->hcs_params))
|
||||
temp |= 0x0001; /* per-port power control */
|
||||
else
|
||||
temp |= 0x0002; /* no power switching */
|
||||
#if 0
|
||||
// re-enable when we support USB_PORT_FEAT_INDICATOR below.
|
||||
if (HCS_INDICATOR (ehci->hcs_params))
|
||||
|
@ -47,6 +47,12 @@ struct ehci_stats {
|
||||
#define EHCI_MAX_ROOT_PORTS 15 /* see HCS_N_PORTS */
|
||||
|
||||
struct ehci_hcd { /* one per controller */
|
||||
/* glue to PCI and HCD framework */
|
||||
struct ehci_caps __iomem *caps;
|
||||
struct ehci_regs __iomem *regs;
|
||||
struct ehci_dbg_port __iomem *debug;
|
||||
|
||||
__u32 hcs_params; /* cached register copy */
|
||||
spinlock_t lock;
|
||||
|
||||
/* async schedule support */
|
||||
@ -84,11 +90,6 @@ struct ehci_hcd { /* one per controller */
|
||||
|
||||
unsigned is_tdi_rh_tt:1; /* TDI roothub with TT */
|
||||
|
||||
/* glue to PCI and HCD framework */
|
||||
struct ehci_caps __iomem *caps;
|
||||
struct ehci_regs __iomem *regs;
|
||||
__u32 hcs_params; /* cached register copy */
|
||||
|
||||
/* irq statistics */
|
||||
#ifdef EHCI_STATS
|
||||
struct ehci_stats stats;
|
||||
@ -165,7 +166,7 @@ struct ehci_caps {
|
||||
/* these fields are specified as 8 and 16 bit registers,
|
||||
* but some hosts can't perform 8 or 16 bit PCI accesses.
|
||||
*/
|
||||
u32 hc_capbase;
|
||||
u32 hc_capbase;
|
||||
#define HC_LENGTH(p) (((p)>>00)&0x00ff) /* bits 7:0 */
|
||||
#define HC_VERSION(p) (((p)>>16)&0xffff) /* bits 31:16 */
|
||||
u32 hcs_params; /* HCSPARAMS - offset 0x4 */
|
||||
@ -273,7 +274,7 @@ struct ehci_dbg_port {
|
||||
#define DBGP_ENABLED (1<<28)
|
||||
#define DBGP_DONE (1<<16)
|
||||
#define DBGP_INUSE (1<<10)
|
||||
#define DBGP_ERRCODE(x) (((x)>>7)&0x0f)
|
||||
#define DBGP_ERRCODE(x) (((x)>>7)&0x07)
|
||||
# define DBGP_ERR_BAD 1
|
||||
# define DBGP_ERR_SIGNAL 2
|
||||
#define DBGP_ERROR (1<<6)
|
||||
@ -282,11 +283,11 @@ struct ehci_dbg_port {
|
||||
#define DBGP_LEN(x) (((x)>>0)&0x0f)
|
||||
u32 pids;
|
||||
#define DBGP_PID_GET(x) (((x)>>16)&0xff)
|
||||
#define DBGP_PID_SET(data,tok) (((data)<<8)|(tok));
|
||||
#define DBGP_PID_SET(data,tok) (((data)<<8)|(tok))
|
||||
u32 data03;
|
||||
u32 data47;
|
||||
u32 address;
|
||||
#define DBGP_EPADDR(dev,ep) (((dev)<<8)|(ep));
|
||||
#define DBGP_EPADDR(dev,ep) (((dev)<<8)|(ep))
|
||||
} __attribute__ ((packed));
|
||||
|
||||
/*-------------------------------------------------------------------------*/
|
||||
|
@ -4329,7 +4329,7 @@ static int __init etrax_usb_hc_init(void)
|
||||
bus->bus_name="ETRAX 100LX";
|
||||
bus->hcpriv = hc;
|
||||
|
||||
/* Initalize RH to the default address.
|
||||
/* Initialize RH to the default address.
|
||||
And make sure that we have no status change indication */
|
||||
hc->rh.numports = 2; /* The RH has two ports */
|
||||
hc->rh.devnum = 1;
|
||||
|
@ -134,7 +134,7 @@ static void port_power(struct sl811 *sl811, int is_on)
|
||||
|
||||
/* This is a PIO-only HCD. Queueing appends URBs to the endpoint's queue,
|
||||
* and may start I/O. Endpoint queues are scanned during completion irq
|
||||
* handlers (one per packet: ACK, NAK, faults, etc) and urb cancelation.
|
||||
* handlers (one per packet: ACK, NAK, faults, etc) and urb cancellation.
|
||||
*
|
||||
* Using an external DMA engine to copy a packet at a time could work,
|
||||
* though setup/teardown costs may be too big to make it worthwhile.
|
||||
@ -738,7 +738,7 @@ retry:
|
||||
}
|
||||
#endif
|
||||
|
||||
/* port status seems wierd until after reset, so
|
||||
/* port status seems weird until after reset, so
|
||||
* force the reset and make khubd clean up later.
|
||||
*/
|
||||
sl811->port1 |= (1 << USB_PORT_FEAT_C_CONNECTION)
|
||||
|
@ -23,7 +23,7 @@
|
||||
*
|
||||
*
|
||||
* The driver brings the USB functions of the MDC800 to Linux.
|
||||
* To use the Camera you must support the USB Protocoll of the camera
|
||||
* To use the Camera you must support the USB Protocol of the camera
|
||||
* to the Kernel Node.
|
||||
* The Driver uses a misc device Node. Create it with :
|
||||
* mknod /dev/mustek c 180 32
|
||||
|
@ -386,7 +386,7 @@ static int aiptek_convert_from_2s_complement(unsigned char c)
|
||||
* convention above.) I therefore have taken over REL_MISC and ABS_MISC
|
||||
* (for relative and absolute reports, respectively) for communicating
|
||||
* Proximity. Why two events? I thought it interesting to know if the
|
||||
* Proximity event occured while the tablet was in absolute or relative
|
||||
* Proximity event occurred while the tablet was in absolute or relative
|
||||
* mode.
|
||||
*
|
||||
* Other tablets use the notion of a certain minimum stylus pressure
|
||||
|
@ -32,7 +32,7 @@
|
||||
* Changed reset from standard USB dev reset to vendor reset
|
||||
* Changed data sent to host from compensated to raw coordinates
|
||||
* Eliminated vendor/product module params
|
||||
* Performed multiple successfull tests with an EXII-5010UC
|
||||
* Performed multiple successful tests with an EXII-5010UC
|
||||
*
|
||||
* 1.5 02/27/2005 ddstreet@ieee.org
|
||||
* Added module parameter to select raw or hw-calibrated coordinate reporting
|
||||
|
@ -5041,7 +5041,7 @@ ov6xx0_configure(struct usb_ov511 *ov)
|
||||
{ OV511_I2C_BUS, 0x2a, 0x04 }, /* Disable framerate adjust */
|
||||
// { OV511_I2C_BUS, 0x2b, 0xac }, /* Framerate; Set 2a[7] first */
|
||||
{ OV511_I2C_BUS, 0x2d, 0x99 },
|
||||
{ OV511_I2C_BUS, 0x33, 0xa0 }, /* Color Procesing Parameter */
|
||||
{ OV511_I2C_BUS, 0x33, 0xa0 }, /* Color Processing Parameter */
|
||||
{ OV511_I2C_BUS, 0x34, 0xd2 }, /* Max A/D range */
|
||||
{ OV511_I2C_BUS, 0x38, 0x8b },
|
||||
{ OV511_I2C_BUS, 0x39, 0x40 },
|
||||
|
@ -1100,7 +1100,7 @@ static inline int pwc_mpt_set_angle(struct pwc_device *pdev, int pan, int tilt)
|
||||
unsigned char buf[4];
|
||||
|
||||
/* set new relative angle; angles are expressed in degrees * 100,
|
||||
but cam as .5 degree resolution, hence devide by 200. Also
|
||||
but cam as .5 degree resolution, hence divide by 200. Also
|
||||
the angle must be multiplied by 64 before it's send to
|
||||
the cam (??)
|
||||
*/
|
||||
|
@ -272,7 +272,7 @@ static int pwc_allocate_buffers(struct pwc_device *pdev)
|
||||
return -ENXIO;
|
||||
}
|
||||
#endif
|
||||
/* Allocate Isochronuous pipe buffers */
|
||||
/* Allocate Isochronous pipe buffers */
|
||||
for (i = 0; i < MAX_ISO_BUFS; i++) {
|
||||
if (pdev->sbuf[i].data == NULL) {
|
||||
kbuf = kmalloc(ISO_BUFFER_SIZE, GFP_KERNEL);
|
||||
@ -850,7 +850,7 @@ static int pwc_isoc_init(struct pwc_device *pdev)
|
||||
|
||||
if (pdev->vmax_packet_size < 0 || pdev->vmax_packet_size > ISO_MAX_FRAME_SIZE) {
|
||||
Err("Failed to find packet size for video endpoint in current alternate setting.\n");
|
||||
return -ENFILE; /* Odd error, that should be noticable */
|
||||
return -ENFILE; /* Odd error, that should be noticeable */
|
||||
}
|
||||
|
||||
/* Set alternate interface */
|
||||
@ -2128,7 +2128,7 @@ static int __init usb_pwc_init(void)
|
||||
if (leds[1] >= 0)
|
||||
led_off = leds[1];
|
||||
|
||||
/* Big device node whoopla. Basicly, it allows you to assign a
|
||||
/* Big device node whoopla. Basically, it allows you to assign a
|
||||
device node (/dev/videoX) to a camera, based on its type
|
||||
& serial number. The format is [type[.serialnumber]:]node.
|
||||
|
||||
|
@ -75,7 +75,7 @@
|
||||
#define PWC_FPS_SNAPSHOT 0x00400000
|
||||
|
||||
|
||||
/* structure for transfering x & y coordinates */
|
||||
/* structure for transferring x & y coordinates */
|
||||
struct pwc_coord
|
||||
{
|
||||
int x, y; /* guess what */
|
||||
|
@ -859,7 +859,7 @@ static int tower_probe (struct usb_interface *interface, const struct usb_device
|
||||
info ("udev is NULL.");
|
||||
}
|
||||
|
||||
/* allocate memory for our device state and intialize it */
|
||||
/* allocate memory for our device state and initialize it */
|
||||
|
||||
dev = kmalloc (sizeof(struct lego_usb_tower), GFP_KERNEL);
|
||||
|
||||
|
@ -4070,6 +4070,9 @@ static const struct usb_device_id products [] = {
|
||||
}, {
|
||||
USB_DEVICE (0x8086, 0x07d3), // "blob" bootloader
|
||||
.driver_info = (unsigned long) &blob_info,
|
||||
}, {
|
||||
USB_DEVICE (0x22b8, 0x600c), // USBNET Motorola E680
|
||||
.driver_info = (unsigned long) &linuxdev_info,
|
||||
}, {
|
||||
// Linux Ethernet/RNDIS gadget on pxa210/25x/26x
|
||||
// e.g. Gumstix, current OpenZaurus, ...
|
||||
|
@ -183,7 +183,7 @@ static void zd1201_usbtx(struct urb *urb, struct pt_regs *regs)
|
||||
return;
|
||||
}
|
||||
|
||||
/* Incomming data */
|
||||
/* Incoming data */
|
||||
static void zd1201_usbrx(struct urb *urb, struct pt_regs *regs)
|
||||
{
|
||||
struct zd1201 *zd = urb->context;
|
||||
@ -772,7 +772,7 @@ static int zd1201_net_stop(struct net_device *dev)
|
||||
/*
|
||||
RFC 1042 encapsulates Ethernet frames in 802.11 frames
|
||||
by prefixing them with 0xaa, 0xaa, 0x03) followed by a SNAP OID of 0
|
||||
(0x00, 0x00, 0x00). Zd requires an additionnal padding, copy
|
||||
(0x00, 0x00, 0x00). Zd requires an additional padding, copy
|
||||
of ethernet addresses, length of the standard RFC 1042 packet
|
||||
and a command byte (which is nul for tx).
|
||||
|
||||
@ -1098,7 +1098,7 @@ static int zd1201_get_range(struct net_device *dev,
|
||||
|
||||
/* Little bit of magic here: we only get the quality if we poll
|
||||
* for it, and we never get an actual request to trigger such
|
||||
* a poll. Therefore we 'asume' that the user will soon ask for
|
||||
* a poll. Therefore we 'assume' that the user will soon ask for
|
||||
* the stats after asking the bssid.
|
||||
*/
|
||||
static int zd1201_get_wap(struct net_device *dev,
|
||||
@ -1108,7 +1108,7 @@ static int zd1201_get_wap(struct net_device *dev,
|
||||
unsigned char buffer[6];
|
||||
|
||||
if (!zd1201_getconfig(zd, ZD1201_RID_COMMSQUALITY, buffer, 6)) {
|
||||
/* Unfortunatly the quality and noise reported is useless.
|
||||
/* Unfortunately the quality and noise reported is useless.
|
||||
they seem to be accumulators that increase until you
|
||||
read them, unless we poll on a fixed interval we can't
|
||||
use them
|
||||
|
@ -53,6 +53,15 @@ config USB_SERIAL_GENERIC
|
||||
support" be compiled as a module for this driver to be used
|
||||
properly.
|
||||
|
||||
config USB_SERIAL_AIRPRIME
|
||||
tristate "USB AirPrime CDMA Wireless Driver"
|
||||
depends on USB_SERIAL
|
||||
help
|
||||
Say Y here if you want to use a AirPrime CDMA Wireless PC card.
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
module will be called airprime.
|
||||
|
||||
config USB_SERIAL_BELKIN
|
||||
tristate "USB Belkin and Peracom Single Port Serial Driver"
|
||||
depends on USB_SERIAL
|
||||
|
@ -11,6 +11,7 @@ usbserial-obj-$(CONFIG_USB_EZUSB) += ezusb.o
|
||||
|
||||
usbserial-objs := usb-serial.o generic.o bus.o $(usbserial-obj-y)
|
||||
|
||||
obj-$(CONFIG_USB_SERIAL_AIRPRIME) += airprime.o
|
||||
obj-$(CONFIG_USB_SERIAL_BELKIN) += belkin_sa.o
|
||||
obj-$(CONFIG_USB_SERIAL_CP2101) += cp2101.o
|
||||
obj-$(CONFIG_USB_SERIAL_CYBERJACK) += cyberjack.o
|
||||
|
63
drivers/usb/serial/airprime.c
Normal file
63
drivers/usb/serial/airprime.c
Normal file
@ -0,0 +1,63 @@
|
||||
/*
|
||||
* AirPrime CDMA Wireless Serial USB driver
|
||||
*
|
||||
* Copyright (C) 2005 Greg Kroah-Hartman <gregkh@suse.de>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License version
|
||||
* 2 as published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/tty.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/usb.h>
|
||||
#include "usb-serial.h"
|
||||
|
||||
static struct usb_device_id id_table [] = {
|
||||
{ USB_DEVICE(0xf3d, 0x0112) },
|
||||
{ },
|
||||
};
|
||||
MODULE_DEVICE_TABLE(usb, id_table);
|
||||
|
||||
static struct usb_driver airprime_driver = {
|
||||
.owner = THIS_MODULE,
|
||||
.name = "airprime",
|
||||
.probe = usb_serial_probe,
|
||||
.disconnect = usb_serial_disconnect,
|
||||
.id_table = id_table,
|
||||
};
|
||||
|
||||
static struct usb_serial_device_type airprime_device = {
|
||||
.owner = THIS_MODULE,
|
||||
.name = "airprime",
|
||||
.id_table = id_table,
|
||||
.num_interrupt_in = NUM_DONT_CARE,
|
||||
.num_bulk_in = NUM_DONT_CARE,
|
||||
.num_bulk_out = NUM_DONT_CARE,
|
||||
.num_ports = 1,
|
||||
};
|
||||
|
||||
static int __init airprime_init(void)
|
||||
{
|
||||
int retval;
|
||||
|
||||
retval = usb_serial_register(&airprime_device);
|
||||
if (retval)
|
||||
return retval;
|
||||
retval = usb_register(&airprime_driver);
|
||||
if (retval)
|
||||
usb_serial_deregister(&airprime_device);
|
||||
return retval;
|
||||
}
|
||||
|
||||
static void __exit airprime_exit(void)
|
||||
{
|
||||
usb_deregister(&airprime_driver);
|
||||
usb_serial_deregister(&airprime_device);
|
||||
}
|
||||
|
||||
module_init(airprime_init);
|
||||
module_exit(airprime_exit);
|
||||
MODULE_LICENSE("GPL");
|
@ -16,6 +16,14 @@
|
||||
* See http://geocities.com/i0xox0i for information on this driver and the
|
||||
* earthmate usb device.
|
||||
*
|
||||
* Lonnie Mendez <dignome@gmail.com>
|
||||
* 4-29-2005
|
||||
* Fixed problem where setting or retreiving the serial config would fail with
|
||||
* EPIPE. Removed CRTS toggling so the driver behaves more like other usbserial
|
||||
* adapters. Issued new interval of 1ms instead of the default 10ms. As a
|
||||
* result, transfer speed has been substantially increased. From avg. 850bps to
|
||||
* avg. 3300bps. initial termios has also been modified. Cleaned up code and
|
||||
* formatting issues so it is more readable. Replaced the C++ style comments.
|
||||
*
|
||||
* Lonnie Mendez <dignome@gmail.com>
|
||||
* 12-15-2004
|
||||
@ -32,12 +40,6 @@
|
||||
* 10-2003
|
||||
* Driver first released.
|
||||
*
|
||||
*
|
||||
* Long Term TODO:
|
||||
* Improve transfer speeds - both read/write are somewhat slow
|
||||
* at this point.
|
||||
* Improve debugging. Show modem line status with debug output and
|
||||
* implement filtering for certain data as a module parameter.
|
||||
*/
|
||||
|
||||
/* Thanks to Neil Whelchel for writing the first cypress m8 implementation for linux. */
|
||||
@ -72,11 +74,12 @@
|
||||
static int debug;
|
||||
#endif
|
||||
static int stats;
|
||||
static int interval;
|
||||
|
||||
/*
|
||||
* Version Information
|
||||
*/
|
||||
#define DRIVER_VERSION "v1.08"
|
||||
#define DRIVER_VERSION "v1.09"
|
||||
#define DRIVER_AUTHOR "Lonnie Mendez <dignome@gmail.com>, Neil Whelchel <koyama@firstlight.net>"
|
||||
#define DRIVER_DESC "Cypress USB to Serial Driver"
|
||||
|
||||
@ -130,7 +133,6 @@ struct cypress_private {
|
||||
char prev_status, diff_status; /* used for TIOCMIWAIT */
|
||||
/* we pass a pointer to this as the arguement sent to cypress_set_termios old_termios */
|
||||
struct termios tmp_termios; /* stores the old termios settings */
|
||||
char calledfromopen; /* used when issuing lines on open - fixes rts drop bug */
|
||||
};
|
||||
|
||||
/* write buffer structure */
|
||||
@ -168,10 +170,8 @@ static void cypress_buf_free(struct cypress_buf *cb);
|
||||
static void cypress_buf_clear(struct cypress_buf *cb);
|
||||
static unsigned int cypress_buf_data_avail(struct cypress_buf *cb);
|
||||
static unsigned int cypress_buf_space_avail(struct cypress_buf *cb);
|
||||
static unsigned int cypress_buf_put(struct cypress_buf *cb, const char *buf,
|
||||
unsigned int count);
|
||||
static unsigned int cypress_buf_get(struct cypress_buf *cb, char *buf,
|
||||
unsigned int count);
|
||||
static unsigned int cypress_buf_put(struct cypress_buf *cb, const char *buf, unsigned int count);
|
||||
static unsigned int cypress_buf_get(struct cypress_buf *cb, char *buf, unsigned int count);
|
||||
|
||||
|
||||
static struct usb_serial_device_type cypress_earthmate_device = {
|
||||
@ -234,14 +234,13 @@ static struct usb_serial_device_type cypress_hidcom_device = {
|
||||
*****************************************************************************/
|
||||
|
||||
|
||||
/* This function can either set or retreive the current serial line settings */
|
||||
/* This function can either set or retrieve the current serial line settings */
|
||||
static int cypress_serial_control (struct usb_serial_port *port, unsigned baud_mask, int data_bits, int stop_bits,
|
||||
int parity_enable, int parity_type, int reset, int cypress_request_type)
|
||||
{
|
||||
int i, n_baud_rate = 0, retval = 0;
|
||||
int new_baudrate = 0, retval = 0, tries = 0;
|
||||
struct cypress_private *priv;
|
||||
__u8 feature_buffer[5];
|
||||
__u8 config;
|
||||
__u8 feature_buffer[8];
|
||||
unsigned long flags;
|
||||
|
||||
dbg("%s", __FUNCTION__);
|
||||
@ -256,7 +255,8 @@ static int cypress_serial_control (struct usb_serial_port *port, unsigned baud_m
|
||||
* of 57600bps (I have no idea whether DeLorme chose to use the general purpose
|
||||
* firmware or not), if you need to modify this speed setting for your own
|
||||
* project please add your own chiptype and modify the code likewise. The
|
||||
* Cypress HID->COM device will work successfully up to 115200bps.
|
||||
* Cypress HID->COM device will work successfully up to 115200bps (but the
|
||||
* actual throughput is around 3kBps).
|
||||
*/
|
||||
if (baud_mask != priv->cbr_mask) {
|
||||
dbg("%s - baud rate is changing", __FUNCTION__);
|
||||
@ -265,109 +265,114 @@ static int cypress_serial_control (struct usb_serial_port *port, unsigned baud_m
|
||||
* but are not used with NMEA and SiRF protocols */
|
||||
|
||||
if ( (baud_mask == B300) || (baud_mask == B600) ) {
|
||||
err("%s - failed setting baud rate, unsupported speed (default to 4800)",
|
||||
err("%s - failed setting baud rate, unsupported speed",
|
||||
__FUNCTION__);
|
||||
n_baud_rate = 4800;
|
||||
} else if ( (n_baud_rate = mask_to_rate(baud_mask)) == -1) {
|
||||
err("%s - failed setting baud rate, unsupported speed (default to 4800)",
|
||||
new_baudrate = priv->baud_rate;
|
||||
} else if ( (new_baudrate = mask_to_rate(baud_mask)) == -1) {
|
||||
err("%s - failed setting baud rate, unsupported speed",
|
||||
__FUNCTION__);
|
||||
n_baud_rate = 4800;
|
||||
new_baudrate = priv->baud_rate;
|
||||
}
|
||||
} else if (priv->chiptype == CT_CYPHIDCOM) {
|
||||
if ( (n_baud_rate = mask_to_rate(baud_mask)) == -1) {
|
||||
err("%s - failed setting baud rate, unsupported speed (default to 4800)",
|
||||
if ( (new_baudrate = mask_to_rate(baud_mask)) == -1) {
|
||||
err("%s - failed setting baud rate, unsupported speed",
|
||||
__FUNCTION__);
|
||||
n_baud_rate = 4800;
|
||||
new_baudrate = priv->baud_rate;
|
||||
}
|
||||
} else if (priv->chiptype == CT_GENERIC) {
|
||||
if ( (n_baud_rate = mask_to_rate(baud_mask)) == -1) {
|
||||
err("%s - failed setting baud rate, unsupported speed (default to 4800)",
|
||||
if ( (new_baudrate = mask_to_rate(baud_mask)) == -1) {
|
||||
err("%s - failed setting baud rate, unsupported speed",
|
||||
__FUNCTION__);
|
||||
n_baud_rate = 4800;
|
||||
new_baudrate = priv->baud_rate;
|
||||
}
|
||||
} else {
|
||||
info("%s - please define your chiptype, using 4800bps default", __FUNCTION__);
|
||||
n_baud_rate = 4800;
|
||||
info("%s - please define your chiptype", __FUNCTION__);
|
||||
new_baudrate = priv->baud_rate;
|
||||
}
|
||||
} else { /* baud rate not changing, keep the old */
|
||||
n_baud_rate = priv->baud_rate;
|
||||
new_baudrate = priv->baud_rate;
|
||||
}
|
||||
dbg("%s - baud rate is being sent as %d", __FUNCTION__, n_baud_rate);
|
||||
|
||||
dbg("%s - baud rate is being sent as %d", __FUNCTION__, new_baudrate);
|
||||
|
||||
/*
|
||||
* This algorithm accredited to Jiang Jay Zhang... thanks for all the help!
|
||||
*/
|
||||
for (i = 0; i < 4; ++i) {
|
||||
feature_buffer[i] = ( n_baud_rate >> (i*8) & 0xFF );
|
||||
}
|
||||
memset(feature_buffer, 0, 8);
|
||||
/* fill the feature_buffer with new configuration */
|
||||
*((u_int32_t *)feature_buffer) = new_baudrate;
|
||||
|
||||
config = 0; // reset config byte
|
||||
config |= data_bits; // assign data bits in 2 bit space ( max 3 )
|
||||
feature_buffer[4] |= data_bits; /* assign data bits in 2 bit space ( max 3 ) */
|
||||
/* 1 bit gap */
|
||||
config |= (stop_bits << 3); // assign stop bits in 1 bit space
|
||||
config |= (parity_enable << 4); // assign parity flag in 1 bit space
|
||||
config |= (parity_type << 5); // assign parity type in 1 bit space
|
||||
feature_buffer[4] |= (stop_bits << 3); /* assign stop bits in 1 bit space */
|
||||
feature_buffer[4] |= (parity_enable << 4); /* assign parity flag in 1 bit space */
|
||||
feature_buffer[4] |= (parity_type << 5); /* assign parity type in 1 bit space */
|
||||
/* 1 bit gap */
|
||||
config |= (reset << 7); // assign reset at end of byte, 1 bit space
|
||||
|
||||
feature_buffer[4] = config;
|
||||
feature_buffer[4] |= (reset << 7); /* assign reset at end of byte, 1 bit space */
|
||||
|
||||
dbg("%s - device is being sent this feature report:", __FUNCTION__);
|
||||
dbg("%s - %02X - %02X - %02X - %02X - %02X", __FUNCTION__, feature_buffer[0], feature_buffer[1],
|
||||
feature_buffer[2], feature_buffer[3], feature_buffer[4]);
|
||||
|
||||
do {
|
||||
retval = usb_control_msg (port->serial->dev, usb_sndctrlpipe(port->serial->dev, 0),
|
||||
HID_REQ_SET_REPORT, USB_DIR_OUT | USB_RECIP_INTERFACE | USB_TYPE_CLASS,
|
||||
0x0300, 0, feature_buffer, 5, 500);
|
||||
0x0300, 0, feature_buffer, 8, 500);
|
||||
|
||||
if (retval != 5)
|
||||
if (tries++ >= 3)
|
||||
break;
|
||||
|
||||
if (retval == EPIPE)
|
||||
usb_clear_halt(port->serial->dev, 0x00);
|
||||
} while (retval != 8 && retval != ENODEV);
|
||||
|
||||
if (retval != 8)
|
||||
err("%s - failed sending serial line settings - %d", __FUNCTION__, retval);
|
||||
else {
|
||||
spin_lock_irqsave(&priv->lock, flags);
|
||||
priv->baud_rate = n_baud_rate;
|
||||
priv->baud_rate = new_baudrate;
|
||||
priv->cbr_mask = baud_mask;
|
||||
priv->current_config = config;
|
||||
++priv->cmd_count;
|
||||
priv->current_config = feature_buffer[4];
|
||||
spin_unlock_irqrestore(&priv->lock, flags);
|
||||
}
|
||||
break;
|
||||
case CYPRESS_GET_CONFIG:
|
||||
dbg("%s - retreiving serial line settings", __FUNCTION__);
|
||||
/* reset values in feature buffer */
|
||||
memset(feature_buffer, 0, 5);
|
||||
/* set initial values in feature buffer */
|
||||
memset(feature_buffer, 0, 8);
|
||||
|
||||
do {
|
||||
retval = usb_control_msg (port->serial->dev, usb_rcvctrlpipe(port->serial->dev, 0),
|
||||
HID_REQ_GET_REPORT, USB_DIR_IN | USB_RECIP_INTERFACE | USB_TYPE_CLASS,
|
||||
0x0300, 0, feature_buffer, 5, 500);
|
||||
0x0300, 0, feature_buffer, 8, 500);
|
||||
|
||||
if (tries++ >= 3)
|
||||
break;
|
||||
|
||||
if (retval == EPIPE)
|
||||
usb_clear_halt(port->serial->dev, 0x00);
|
||||
} while (retval != 5 && retval != ENODEV);
|
||||
|
||||
if (retval != 5) {
|
||||
err("%s - failed to retreive serial line settings - %d", __FUNCTION__, retval);
|
||||
return retval;
|
||||
} else {
|
||||
spin_lock_irqsave(&priv->lock, flags);
|
||||
|
||||
/* store the config in one byte, and later use bit masks to check values */
|
||||
priv->current_config = feature_buffer[4];
|
||||
/* reverse the process above to get the baud_mask value */
|
||||
n_baud_rate = 0; // reset bits
|
||||
for (i = 0; i < 4; ++i) {
|
||||
n_baud_rate |= ( feature_buffer[i] << (i*8) );
|
||||
}
|
||||
priv->baud_rate = *((u_int32_t *)feature_buffer);
|
||||
|
||||
priv->baud_rate = n_baud_rate;
|
||||
if ( (priv->cbr_mask = rate_to_mask(n_baud_rate)) == 0x40)
|
||||
if ( (priv->cbr_mask = rate_to_mask(priv->baud_rate)) == 0x40)
|
||||
dbg("%s - failed setting the baud mask (not defined)", __FUNCTION__);
|
||||
++priv->cmd_count;
|
||||
spin_unlock_irqrestore(&priv->lock, flags);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
err("%s - unsupported serial control command issued", __FUNCTION__);
|
||||
}
|
||||
spin_lock_irqsave(&priv->lock, flags);
|
||||
++priv->cmd_count;
|
||||
spin_unlock_irqrestore(&priv->lock, flags);
|
||||
|
||||
return retval;
|
||||
} /* cypress_serial_control */
|
||||
|
||||
|
||||
/* given a baud mask, it will return speed on success */
|
||||
/* given a baud mask, it will return integer baud on success */
|
||||
static int mask_to_rate (unsigned mask)
|
||||
{
|
||||
int rate;
|
||||
@ -438,11 +443,12 @@ static int generic_startup (struct usb_serial *serial)
|
||||
|
||||
usb_reset_configuration (serial->dev);
|
||||
|
||||
interval = 1;
|
||||
priv->cmd_ctrl = 0;
|
||||
priv->line_control = 0;
|
||||
priv->termios_initialized = 0;
|
||||
priv->calledfromopen = 0;
|
||||
priv->rx_flags = 0;
|
||||
priv->cbr_mask = B300;
|
||||
usb_set_serial_port_data(serial->port[0], priv);
|
||||
|
||||
return (0);
|
||||
@ -513,7 +519,6 @@ static int cypress_open (struct usb_serial_port *port, struct file *filp)
|
||||
dbg("%s - port %d", __FUNCTION__, port->number);
|
||||
|
||||
/* clear halts before open */
|
||||
usb_clear_halt(serial->dev, 0x00);
|
||||
usb_clear_halt(serial->dev, 0x81);
|
||||
usb_clear_halt(serial->dev, 0x02);
|
||||
|
||||
@ -531,7 +536,6 @@ static int cypress_open (struct usb_serial_port *port, struct file *filp)
|
||||
/* raise both lines and set termios */
|
||||
spin_lock_irqsave(&priv->lock, flags);
|
||||
priv->line_control = CONTROL_DTR | CONTROL_RTS;
|
||||
priv->calledfromopen = 1;
|
||||
priv->cmd_ctrl = 1;
|
||||
spin_unlock_irqrestore(&priv->lock, flags);
|
||||
result = cypress_write(port, NULL, 0);
|
||||
@ -553,7 +557,7 @@ static int cypress_open (struct usb_serial_port *port, struct file *filp)
|
||||
usb_fill_int_urb(port->interrupt_in_urb, serial->dev,
|
||||
usb_rcvintpipe(serial->dev, port->interrupt_in_endpointAddress),
|
||||
port->interrupt_in_urb->transfer_buffer, port->interrupt_in_urb->transfer_buffer_length,
|
||||
cypress_read_int_callback, port, port->interrupt_in_urb->interval);
|
||||
cypress_read_int_callback, port, interval);
|
||||
result = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL);
|
||||
|
||||
if (result){
|
||||
@ -680,12 +684,12 @@ static void cypress_send(struct usb_serial_port *port)
|
||||
spin_lock_irqsave(&priv->lock, flags);
|
||||
switch (port->interrupt_out_size) {
|
||||
case 32:
|
||||
// this is for the CY7C64013...
|
||||
/* this is for the CY7C64013... */
|
||||
offset = 2;
|
||||
port->interrupt_out_buffer[0] = priv->line_control;
|
||||
break;
|
||||
case 8:
|
||||
// this is for the CY7C63743...
|
||||
/* this is for the CY7C63743... */
|
||||
offset = 1;
|
||||
port->interrupt_out_buffer[0] = priv->line_control;
|
||||
break;
|
||||
@ -738,6 +742,7 @@ send:
|
||||
|
||||
port->interrupt_out_urb->transfer_buffer_length = actual_size;
|
||||
port->interrupt_out_urb->dev = port->serial->dev;
|
||||
port->interrupt_out_urb->interval = interval;
|
||||
result = usb_submit_urb (port->interrupt_out_urb, GFP_ATOMIC);
|
||||
if (result) {
|
||||
dev_err(&port->dev, "%s - failed submitting write urb, error %d\n", __FUNCTION__,
|
||||
@ -910,7 +915,7 @@ static void cypress_set_termios (struct usb_serial_port *port, struct termios *o
|
||||
unsigned cflag, iflag, baud_mask;
|
||||
unsigned long flags;
|
||||
__u8 oldlines;
|
||||
int linechange;
|
||||
int linechange = 0;
|
||||
|
||||
dbg("%s - port %d", __FUNCTION__, port->number);
|
||||
|
||||
@ -996,15 +1001,7 @@ static void cypress_set_termios (struct usb_serial_port *port, struct termios *o
|
||||
case B115200: dbg("%s - setting baud 115200bps", __FUNCTION__); break;
|
||||
default: dbg("%s - unknown masked baud rate", __FUNCTION__);
|
||||
}
|
||||
priv->line_control |= CONTROL_DTR;
|
||||
|
||||
/* toggle CRTSCTS? - don't do this if being called from cypress_open */
|
||||
if (!priv->calledfromopen) {
|
||||
if (cflag & CRTSCTS)
|
||||
priv->line_control |= CONTROL_RTS;
|
||||
else
|
||||
priv->line_control &= ~CONTROL_RTS;
|
||||
}
|
||||
priv->line_control = (CONTROL_DTR | CONTROL_RTS);
|
||||
}
|
||||
spin_unlock_irqrestore(&priv->lock, flags);
|
||||
|
||||
@ -1014,8 +1011,6 @@ static void cypress_set_termios (struct usb_serial_port *port, struct termios *o
|
||||
cypress_serial_control(port, baud_mask, data_bits, stop_bits, parity_enable,
|
||||
parity_type, 0, CYPRESS_SET_CONFIG);
|
||||
|
||||
msleep(50); /* give some time between change and read (50ms) */
|
||||
|
||||
/* we perform a CYPRESS_GET_CONFIG so that the current settings are filled into the private structure
|
||||
* this should confirm that all is working if it returns what we just set */
|
||||
cypress_serial_control(port, 0, 0, 0, 0, 0, 0, CYPRESS_GET_CONFIG);
|
||||
@ -1031,7 +1026,6 @@ static void cypress_set_termios (struct usb_serial_port *port, struct termios *o
|
||||
dbg("Using custom termios settings for a baud rate of 4800bps.");
|
||||
/* define custom termios settings for NMEA protocol */
|
||||
|
||||
|
||||
tty->termios->c_iflag /* input modes - */
|
||||
&= ~(IGNBRK /* disable ignore break */
|
||||
| BRKINT /* disable break causes interrupt */
|
||||
@ -1052,23 +1046,16 @@ static void cypress_set_termios (struct usb_serial_port *port, struct termios *o
|
||||
| ISIG /* disable interrupt, quit, and suspend special characters */
|
||||
| IEXTEN); /* disable non-POSIX special characters */
|
||||
|
||||
} else if (priv->chiptype == CT_CYPHIDCOM) {
|
||||
} /* CT_CYPHIDCOM: Application should handle this for device */
|
||||
|
||||
// Software app handling it for device...
|
||||
|
||||
}
|
||||
linechange = (priv->line_control != oldlines);
|
||||
spin_unlock_irqrestore(&priv->lock, flags);
|
||||
|
||||
/* if necessary, set lines */
|
||||
if (!priv->calledfromopen && linechange) {
|
||||
if (linechange) {
|
||||
priv->cmd_ctrl = 1;
|
||||
cypress_write(port, NULL, 0);
|
||||
}
|
||||
|
||||
if (priv->calledfromopen)
|
||||
priv->calledfromopen = 0;
|
||||
|
||||
} /* cypress_set_termios */
|
||||
|
||||
|
||||
@ -1164,7 +1151,7 @@ static void cypress_read_int_callback(struct urb *urb, struct pt_regs *regs)
|
||||
spin_lock_irqsave(&priv->lock, flags);
|
||||
switch(urb->actual_length) {
|
||||
case 32:
|
||||
// This is for the CY7C64013...
|
||||
/* This is for the CY7C64013... */
|
||||
priv->current_status = data[0] & 0xF8;
|
||||
bytes = data[1]+2;
|
||||
i=2;
|
||||
@ -1172,7 +1159,7 @@ static void cypress_read_int_callback(struct urb *urb, struct pt_regs *regs)
|
||||
havedata = 1;
|
||||
break;
|
||||
case 8:
|
||||
// This is for the CY7C63743...
|
||||
/* This is for the CY7C63743... */
|
||||
priv->current_status = data[0] & 0xF8;
|
||||
bytes = (data[0] & 0x07)+1;
|
||||
i=1;
|
||||
@ -1245,7 +1232,7 @@ continue_read:
|
||||
port->interrupt_in_urb->transfer_buffer,
|
||||
port->interrupt_in_urb->transfer_buffer_length,
|
||||
cypress_read_int_callback, port,
|
||||
port->interrupt_in_urb->interval);
|
||||
interval);
|
||||
result = usb_submit_urb(port->interrupt_in_urb, GFP_ATOMIC);
|
||||
if (result)
|
||||
dev_err(&urb->dev->dev, "%s - failed resubmitting read urb, error %d\n", __FUNCTION__, result);
|
||||
@ -1274,6 +1261,8 @@ static void cypress_write_int_callback(struct urb *urb, struct pt_regs *regs)
|
||||
dbg("%s - urb shutting down with status: %d", __FUNCTION__, urb->status);
|
||||
priv->write_urb_in_use = 0;
|
||||
return;
|
||||
case -EPIPE: /* no break needed */
|
||||
usb_clear_halt(port->serial->dev, 0x02);
|
||||
default:
|
||||
/* error in the urb, so we have to resubmit it */
|
||||
dbg("%s - Overflow in write", __FUNCTION__);
|
||||
@ -1535,3 +1524,5 @@ module_param(debug, bool, S_IRUGO | S_IWUSR);
|
||||
MODULE_PARM_DESC(debug, "Debug enabled or not");
|
||||
module_param(stats, bool, S_IRUGO | S_IWUSR);
|
||||
MODULE_PARM_DESC(stats, "Enable statistics or not");
|
||||
module_param(interval, int, S_IRUGO | S_IWUSR);
|
||||
MODULE_PARM_DESC(interval, "Overrides interrupt interval");
|
||||
|
@ -76,7 +76,7 @@
|
||||
* Defererence pointers after any paranoid checks, not before.
|
||||
*
|
||||
* (21/Jun/2003) Erik Nygren
|
||||
* Added support for Home Electronics Tira-1 IR tranceiver using FT232BM chip.
|
||||
* Added support for Home Electronics Tira-1 IR transceiver using FT232BM chip.
|
||||
* See <http://www.home-electro.com/tira1.htm>. Only operates properly
|
||||
* at 100000 and RTS-CTS, so set custom divisor mode on startup.
|
||||
* Also force the Tira-1 and USB-UIRT to only use their custom baud rates.
|
||||
@ -91,7 +91,7 @@
|
||||
* Minor whitespace and comment changes.
|
||||
*
|
||||
* (12/Jun/2003) David Norwood
|
||||
* Added support for USB-UIRT IR tranceiver using 8U232AM chip.
|
||||
* Added support for USB-UIRT IR transceiver using 8U232AM chip.
|
||||
* See <http://home.earthlink.net/~jrhees/USBUIRT/index.htm>. Only
|
||||
* operates properly at 312500, so set custom divisor mode on startup.
|
||||
*
|
||||
@ -272,6 +272,7 @@ static int debug;
|
||||
|
||||
static struct usb_device_id id_table_sio [] = {
|
||||
{ USB_DEVICE(FTDI_VID, FTDI_SIO_PID) },
|
||||
{ USB_DEVICE(MOBILITY_VID, MOBILITY_USB_SERIAL_PID) },
|
||||
{ } /* Terminating entry */
|
||||
};
|
||||
|
||||
@ -296,7 +297,6 @@ static struct usb_device_id id_table_8U232AM [] = {
|
||||
{ USB_DEVICE_VER(FTDI_VID, FTDI_IRTRANS_PID, 0, 0x3ff) },
|
||||
{ USB_DEVICE_VER(FTDI_VID, FTDI_8U232AM_PID, 0, 0x3ff) },
|
||||
{ USB_DEVICE_VER(FTDI_VID, FTDI_8U232AM_ALT_PID, 0, 0x3ff) },
|
||||
{ USB_DEVICE_VER(FTDI_VID, FTDI_8U232AM_ALT_ALT_PID, 0, 0x3ff) },
|
||||
{ USB_DEVICE_VER(FTDI_VID, FTDI_RELAIS_PID, 0, 0x3ff) },
|
||||
{ USB_DEVICE(INTERBIOMETRICS_VID, INTERBIOMETRICS_IOBOARD_PID) },
|
||||
{ USB_DEVICE(INTERBIOMETRICS_VID, INTERBIOMETRICS_MINI_IOBOARD_PID) },
|
||||
@ -369,11 +369,14 @@ static struct usb_device_id id_table_8U232AM [] = {
|
||||
{ USB_DEVICE_VER(INTREPID_VID, INTREPID_NEOVI_PID, 0, 0x3ff) },
|
||||
{ USB_DEVICE_VER(FALCOM_VID, FALCOM_TWIST_PID, 0, 0x3ff) },
|
||||
{ USB_DEVICE_VER(FTDI_VID, FTDI_SUUNTO_SPORTS_PID, 0, 0x3ff) },
|
||||
{ USB_DEVICE_VER(FTDI_RM_VID, FTDI_RMCANVIEW_PID, 0, 0x3ff) },
|
||||
{ USB_DEVICE_VER(FTDI_VID, FTDI_RM_CANVIEW_PID, 0, 0x3ff) },
|
||||
{ USB_DEVICE_VER(BANDB_VID, BANDB_USOTL4_PID, 0, 0x3ff) },
|
||||
{ USB_DEVICE_VER(BANDB_VID, BANDB_USTL4_PID, 0, 0x3ff) },
|
||||
{ USB_DEVICE_VER(BANDB_VID, BANDB_USO9ML2_PID, 0, 0x3ff) },
|
||||
{ USB_DEVICE_VER(FTDI_VID, EVER_ECO_PRO_CDS, 0, 0x3ff) },
|
||||
{ USB_DEVICE_VER(FTDI_VID, FTDI_4N_GALAXY_DE_0_PID, 0, 0x3ff) },
|
||||
{ USB_DEVICE_VER(FTDI_VID, FTDI_4N_GALAXY_DE_1_PID, 0, 0x3ff) },
|
||||
{ USB_DEVICE_VER(FTDI_VID, FTDI_4N_GALAXY_DE_2_PID, 0, 0x3ff) },
|
||||
{ } /* Terminating entry */
|
||||
};
|
||||
|
||||
@ -382,7 +385,6 @@ static struct usb_device_id id_table_FT232BM [] = {
|
||||
{ USB_DEVICE_VER(FTDI_VID, FTDI_IRTRANS_PID, 0x400, 0xffff) },
|
||||
{ USB_DEVICE_VER(FTDI_VID, FTDI_8U232AM_PID, 0x400, 0xffff) },
|
||||
{ USB_DEVICE_VER(FTDI_VID, FTDI_8U232AM_ALT_PID, 0x400, 0xffff) },
|
||||
{ USB_DEVICE_VER(FTDI_VID, FTDI_8U232AM_ALT_ALT_PID, 0x400, 0xffff) },
|
||||
{ USB_DEVICE_VER(FTDI_VID, FTDI_RELAIS_PID, 0x400, 0xffff) },
|
||||
{ USB_DEVICE_VER(FTDI_NF_RIC_VID, FTDI_NF_RIC_PID, 0x400, 0xffff) },
|
||||
{ USB_DEVICE_VER(FTDI_VID, FTDI_XF_632_PID, 0x400, 0xffff) },
|
||||
@ -485,11 +487,15 @@ static struct usb_device_id id_table_FT232BM [] = {
|
||||
{ USB_DEVICE_VER(INTREPID_VID, INTREPID_NEOVI_PID, 0x400, 0xffff) },
|
||||
{ USB_DEVICE_VER(FALCOM_VID, FALCOM_TWIST_PID, 0x400, 0xffff) },
|
||||
{ USB_DEVICE_VER(FTDI_VID, FTDI_SUUNTO_SPORTS_PID, 0x400, 0xffff) },
|
||||
{ USB_DEVICE_VER(FTDI_RM_VID, FTDI_RMCANVIEW_PID, 0x400, 0xffff) },
|
||||
{ USB_DEVICE_VER(FTDI_VID, FTDI_RM_CANVIEW_PID, 0x400, 0xffff) },
|
||||
{ USB_DEVICE_VER(BANDB_VID, BANDB_USOTL4_PID, 0x400, 0xffff) },
|
||||
{ USB_DEVICE_VER(BANDB_VID, BANDB_USTL4_PID, 0x400, 0xffff) },
|
||||
{ USB_DEVICE_VER(BANDB_VID, BANDB_USO9ML2_PID, 0x400, 0xffff) },
|
||||
{ USB_DEVICE_VER(FTDI_VID, EVER_ECO_PRO_CDS, 0x400, 0xffff) },
|
||||
{ USB_DEVICE_VER(FTDI_VID, FTDI_4N_GALAXY_DE_0_PID, 0x400, 0xffff) },
|
||||
{ USB_DEVICE_VER(FTDI_VID, FTDI_4N_GALAXY_DE_1_PID, 0x400, 0xffff) },
|
||||
{ USB_DEVICE_VER(FTDI_VID, FTDI_4N_GALAXY_DE_2_PID, 0x400, 0xffff) },
|
||||
{ USB_DEVICE_VER(FTDI_VID, FTDI_ACTIVE_ROBOTS_PID, 0x400, 0xffff) },
|
||||
{ } /* Terminating entry */
|
||||
};
|
||||
|
||||
@ -517,7 +523,6 @@ static struct usb_device_id id_table_combined [] = {
|
||||
{ USB_DEVICE(FTDI_VID, FTDI_SIO_PID) },
|
||||
{ USB_DEVICE(FTDI_VID, FTDI_8U232AM_PID) },
|
||||
{ USB_DEVICE(FTDI_VID, FTDI_8U232AM_ALT_PID) },
|
||||
{ USB_DEVICE(FTDI_VID, FTDI_8U232AM_ALT_ALT_PID) },
|
||||
{ USB_DEVICE(FTDI_VID, FTDI_8U2232C_PID) },
|
||||
{ USB_DEVICE(FTDI_VID, FTDI_RELAIS_PID) },
|
||||
{ USB_DEVICE(INTERBIOMETRICS_VID, INTERBIOMETRICS_IOBOARD_PID) },
|
||||
@ -596,6 +601,22 @@ static struct usb_device_id id_table_combined [] = {
|
||||
{ USB_DEVICE(FTDI_VID, PROTEGO_R2X0) },
|
||||
{ USB_DEVICE(FTDI_VID, PROTEGO_SPECIAL_3) },
|
||||
{ USB_DEVICE(FTDI_VID, PROTEGO_SPECIAL_4) },
|
||||
{ USB_DEVICE_VER(FTDI_VID, FTDI_GUDEADS_E808_PID, 0x400, 0xffff) },
|
||||
{ USB_DEVICE_VER(FTDI_VID, FTDI_GUDEADS_E809_PID, 0x400, 0xffff) },
|
||||
{ USB_DEVICE_VER(FTDI_VID, FTDI_GUDEADS_E80A_PID, 0x400, 0xffff) },
|
||||
{ USB_DEVICE_VER(FTDI_VID, FTDI_GUDEADS_E80B_PID, 0x400, 0xffff) },
|
||||
{ USB_DEVICE_VER(FTDI_VID, FTDI_GUDEADS_E80C_PID, 0x400, 0xffff) },
|
||||
{ USB_DEVICE_VER(FTDI_VID, FTDI_GUDEADS_E80D_PID, 0x400, 0xffff) },
|
||||
{ USB_DEVICE_VER(FTDI_VID, FTDI_GUDEADS_E80E_PID, 0x400, 0xffff) },
|
||||
{ USB_DEVICE_VER(FTDI_VID, FTDI_GUDEADS_E80F_PID, 0x400, 0xffff) },
|
||||
{ USB_DEVICE_VER(FTDI_VID, FTDI_GUDEADS_E888_PID, 0x400, 0xffff) },
|
||||
{ USB_DEVICE_VER(FTDI_VID, FTDI_GUDEADS_E889_PID, 0x400, 0xffff) },
|
||||
{ USB_DEVICE_VER(FTDI_VID, FTDI_GUDEADS_E88A_PID, 0x400, 0xffff) },
|
||||
{ USB_DEVICE_VER(FTDI_VID, FTDI_GUDEADS_E88B_PID, 0x400, 0xffff) },
|
||||
{ USB_DEVICE_VER(FTDI_VID, FTDI_GUDEADS_E88C_PID, 0x400, 0xffff) },
|
||||
{ USB_DEVICE_VER(FTDI_VID, FTDI_GUDEADS_E88D_PID, 0x400, 0xffff) },
|
||||
{ USB_DEVICE_VER(FTDI_VID, FTDI_GUDEADS_E88E_PID, 0x400, 0xffff) },
|
||||
{ USB_DEVICE_VER(FTDI_VID, FTDI_GUDEADS_E88F_PID, 0x400, 0xffff) },
|
||||
{ USB_DEVICE(FTDI_VID, FTDI_ELV_UO100_PID) },
|
||||
{ USB_DEVICE_VER(FTDI_VID, LINX_SDMUSBQSS_PID, 0x400, 0xffff) },
|
||||
{ USB_DEVICE_VER(FTDI_VID, LINX_MASTERDEVEL2_PID, 0x400, 0xffff) },
|
||||
@ -609,11 +630,16 @@ static struct usb_device_id id_table_combined [] = {
|
||||
{ USB_DEVICE(INTREPID_VID, INTREPID_NEOVI_PID) },
|
||||
{ USB_DEVICE(FALCOM_VID, FALCOM_TWIST_PID) },
|
||||
{ USB_DEVICE(FTDI_VID, FTDI_SUUNTO_SPORTS_PID) },
|
||||
{ USB_DEVICE(FTDI_RM_VID, FTDI_RMCANVIEW_PID) },
|
||||
{ USB_DEVICE(FTDI_VID, FTDI_RM_CANVIEW_PID) },
|
||||
{ USB_DEVICE(BANDB_VID, BANDB_USOTL4_PID) },
|
||||
{ USB_DEVICE(BANDB_VID, BANDB_USTL4_PID) },
|
||||
{ USB_DEVICE(BANDB_VID, BANDB_USO9ML2_PID) },
|
||||
{ USB_DEVICE(FTDI_VID, EVER_ECO_PRO_CDS) },
|
||||
{ USB_DEVICE(FTDI_VID, FTDI_4N_GALAXY_DE_0_PID) },
|
||||
{ USB_DEVICE(FTDI_VID, FTDI_4N_GALAXY_DE_1_PID) },
|
||||
{ USB_DEVICE(FTDI_VID, FTDI_4N_GALAXY_DE_2_PID) },
|
||||
{ USB_DEVICE(MOBILITY_VID, MOBILITY_USB_SERIAL_PID) },
|
||||
{ USB_DEVICE_VER(FTDI_VID, FTDI_ACTIVE_ROBOTS_PID, 0x400, 0xffff) },
|
||||
{ } /* Terminating entry */
|
||||
};
|
||||
|
||||
@ -1457,10 +1483,10 @@ static int ftdi_FT2232C_startup (struct usb_serial *serial)
|
||||
inter = serial->interface->altsetting->desc.bInterfaceNumber;
|
||||
|
||||
if (inter) {
|
||||
priv->interface = INTERFACE_B;
|
||||
priv->interface = PIT_SIOB;
|
||||
}
|
||||
else {
|
||||
priv->interface = INTERFACE_A;
|
||||
priv->interface = PIT_SIOA;
|
||||
}
|
||||
priv->baud_base = 48000000 / 2; /* Would be / 16, but FT2232C supports multiple of 0.125 divisor fractions! */
|
||||
|
||||
|
@ -26,7 +26,6 @@
|
||||
#define FTDI_SIO_PID 0x8372 /* Product Id SIO application of 8U100AX */
|
||||
#define FTDI_8U232AM_PID 0x6001 /* Similar device to SIO above */
|
||||
#define FTDI_8U232AM_ALT_PID 0x6006 /* FTDI's alternate PID for above */
|
||||
#define FTDI_8U232AM_ALT_ALT_PID 0xf3c0 /* FTDI's second alternate PID for above */
|
||||
#define FTDI_8U2232C_PID 0x6010 /* Dual channel device */
|
||||
#define FTDI_RELAIS_PID 0xFA10 /* Relais device from Rudolf Gugler */
|
||||
#define FTDI_NF_RIC_VID 0x0DCD /* Vendor Id */
|
||||
@ -137,7 +136,7 @@
|
||||
/*
|
||||
* Home Electronics (www.home-electro.com) USB gadgets
|
||||
*/
|
||||
#define FTDI_HE_TIRA1_PID 0xFA78 /* Tira-1 IR tranceiver */
|
||||
#define FTDI_HE_TIRA1_PID 0xFA78 /* Tira-1 IR transceiver */
|
||||
|
||||
/* USB-UIRT - An infrared receiver and transmitter using the 8U232AM chip */
|
||||
/* http://home.earthlink.net/~jrhees/USBUIRT/index.htm */
|
||||
@ -157,7 +156,8 @@
|
||||
*/
|
||||
#define OCT_VID 0x0B39 /* OCT vendor ID */
|
||||
/* Note: OCT US101 is also rebadged as Dick Smith Electronics (NZ) XH6381 */
|
||||
/* Also rebadged as SIIG Inc. model US2308 */
|
||||
/* Also rebadged as Dick Smith Electronics (Aus) XH6451 */
|
||||
/* Also rebadged as SIIG Inc. model US2308 hardware version 1 */
|
||||
#define OCT_US101_PID 0x0421 /* OCT US101 USB to RS-232 */
|
||||
|
||||
/* an infrared receiver for user access control with IR tags */
|
||||
@ -236,10 +236,10 @@
|
||||
|
||||
/*
|
||||
* RM Michaelides CANview USB (http://www.rmcan.com)
|
||||
* CAN filedbus interface adapter, addad by port GmbH www.port.de)
|
||||
* CAN fieldbus interface adapter, added by port GmbH www.port.de)
|
||||
* Ian Abbott changed the macro names for consistency.
|
||||
*/
|
||||
#define FTDI_RM_VID 0x0403 /* Vendor Id */
|
||||
#define FTDI_RMCANVIEW_PID 0xfd60 /* Product Id */
|
||||
#define FTDI_RM_CANVIEW_PID 0xfd60 /* Product Id */
|
||||
|
||||
/*
|
||||
* EVER Eco Pro UPS (http://www.ever.com.pl/)
|
||||
@ -247,6 +247,26 @@
|
||||
|
||||
#define EVER_ECO_PRO_CDS 0xe520 /* RS-232 converter */
|
||||
|
||||
/*
|
||||
* 4N-GALAXY.DE PIDs for CAN-USB, USB-RS232, USB-RS422, USB-RS485,
|
||||
* USB-TTY activ, USB-TTY passiv. Some PIDs are used by several devices
|
||||
* and I'm not entirely sure which are used by which.
|
||||
*/
|
||||
#define FTDI_4N_GALAXY_DE_0_PID 0x8372
|
||||
#define FTDI_4N_GALAXY_DE_1_PID 0xF3C0
|
||||
#define FTDI_4N_GALAXY_DE_2_PID 0xF3C1
|
||||
|
||||
/*
|
||||
* Mobility Electronics products.
|
||||
*/
|
||||
#define MOBILITY_VID 0x1342
|
||||
#define MOBILITY_USB_SERIAL_PID 0x0202 /* EasiDock USB 200 serial */
|
||||
|
||||
/*
|
||||
* Active Robots product ids.
|
||||
*/
|
||||
#define FTDI_ACTIVE_ROBOTS_PID 0xE548 /* USB comms board */
|
||||
|
||||
/* Commands */
|
||||
#define FTDI_SIO_RESET 0 /* Reset the port */
|
||||
#define FTDI_SIO_MODEM_CTRL 1 /* Set the modem control register */
|
||||
@ -259,10 +279,6 @@
|
||||
#define FTDI_SIO_SET_LATENCY_TIMER 9 /* Set the latency timer */
|
||||
#define FTDI_SIO_GET_LATENCY_TIMER 10 /* Get the latency timer */
|
||||
|
||||
/* Port interface code for FT2232C */
|
||||
#define INTERFACE_A 1
|
||||
#define INTERFACE_B 2
|
||||
|
||||
|
||||
/*
|
||||
* BmRequestType: 1100 0000b
|
||||
|
@ -289,7 +289,7 @@
|
||||
//
|
||||
|
||||
//
|
||||
// Edgeport Compatiblity Descriptor
|
||||
// Edgeport Compatibility Descriptor
|
||||
//
|
||||
// This descriptor is only returned by Edgeport-compatible devices
|
||||
// supporting the EPiC spec. True ION devices do not return this
|
||||
|
@ -19,7 +19,7 @@
|
||||
|
||||
This file is available under a BSD-style copyright
|
||||
|
||||
2. The name of InnoSys Incorprated may not be used to endorse or promote
|
||||
2. The name of InnoSys Incorporated may not be used to endorse or promote
|
||||
products derived from this software without specific prior written
|
||||
permission.
|
||||
|
||||
|
@ -47,6 +47,7 @@
|
||||
#include <linux/cdrom.h>
|
||||
#include <scsi/scsi.h>
|
||||
#include <scsi/scsi_cmnd.h>
|
||||
#include <scsi/scsi_dbg.h>
|
||||
|
||||
#include "debug.h"
|
||||
#include "scsi.h"
|
||||
|
@ -786,7 +786,7 @@ static int usbat_flash_check_media(struct us_data *us,
|
||||
if (rc != USB_STOR_XFER_GOOD)
|
||||
return USB_STOR_TRANSPORT_ERROR;
|
||||
|
||||
// Check for media existance
|
||||
// Check for media existence
|
||||
rc = usbat_flash_check_media_present(uio);
|
||||
if (rc == USBAT_FLASH_MEDIA_NONE) {
|
||||
info->sense_key = 0x02;
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* Driver for USB Mass Storage compliant devices
|
||||
* Ununsual Devices File
|
||||
* Unusual Devices File
|
||||
*
|
||||
* $Id: unusual_devs.h,v 1.32 2002/02/25 02:41:24 mdharm Exp $
|
||||
*
|
||||
@ -48,6 +48,14 @@
|
||||
* USB development list <linux-usb-devel@lists.sourceforge.net>.
|
||||
*/
|
||||
|
||||
/* patch submitted by Vivian Bregier <Vivian.Bregier@imag.fr>
|
||||
*/
|
||||
UNUSUAL_DEV( 0x03eb, 0x2002, 0x0100, 0x0100,
|
||||
"ATMEL",
|
||||
"SND1 Storage",
|
||||
US_SC_DEVICE, US_PR_DEVICE, NULL,
|
||||
US_FL_IGNORE_RESIDUE),
|
||||
|
||||
UNUSUAL_DEV( 0x03ee, 0x6901, 0x0000, 0x0100,
|
||||
"Mitsumi",
|
||||
"USB FDD",
|
||||
@ -994,6 +1002,13 @@ UNUSUAL_DEV( 0x1019, 0x0c55, 0x0000, 0x9999,
|
||||
US_SC_DEVICE, US_PR_DEVICE, usb_stor_ucr61s2b_init,
|
||||
0 ),
|
||||
|
||||
/* Reported by Vilius Bilinkevicius <vilisas AT xxx DOT lt) */
|
||||
UNUSUAL_DEV( 0x132b, 0x000b, 0x0001, 0x0001,
|
||||
"Minolta",
|
||||
"Dimage Z10",
|
||||
US_SC_DEVICE, US_PR_DEVICE, NULL,
|
||||
0 ),
|
||||
|
||||
/* Reported by Kotrla Vitezslav <kotrla@ceb.cz> */
|
||||
UNUSUAL_DEV( 0x1370, 0x6828, 0x0110, 0x0110,
|
||||
"SWISSBIT",
|
||||
|
Loading…
Reference in New Issue
Block a user