]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/net/wireless/zd1211rw/zd_usb.c
[PATCH] zd1211rw: Add ID for ZyXEL AG-220
[linux-2.6-omap-h63xx.git] / drivers / net / wireless / zd1211rw / zd_usb.c
index 75ef55624d7fd2cf15820e79127beff3e6e393dd..e04cffc8adf305240d6f7f5923af55550f91262d 100644 (file)
@@ -52,6 +52,7 @@ static struct usb_device_id usb_ids[] = {
        { USB_DEVICE(0x0b3b, 0x1630), .driver_info = DEVICE_ZD1211 },
        { USB_DEVICE(0x0586, 0x3401), .driver_info = DEVICE_ZD1211 },
        { USB_DEVICE(0x14ea, 0xab13), .driver_info = DEVICE_ZD1211 },
+       { USB_DEVICE(0x13b1, 0x001e), .driver_info = DEVICE_ZD1211 },
        /* ZD1211B */
        { USB_DEVICE(0x0ace, 0x1215), .driver_info = DEVICE_ZD1211B },
        { USB_DEVICE(0x157e, 0x300d), .driver_info = DEVICE_ZD1211B },
@@ -62,6 +63,10 @@ static struct usb_device_id usb_ids[] = {
        { USB_DEVICE(0x0471, 0x1236), .driver_info = DEVICE_ZD1211B },
        { USB_DEVICE(0x13b1, 0x0024), .driver_info = DEVICE_ZD1211B },
        { USB_DEVICE(0x0586, 0x340f), .driver_info = DEVICE_ZD1211B },
+       { USB_DEVICE(0x0b05, 0x171b), .driver_info = DEVICE_ZD1211B },
+       { USB_DEVICE(0x0586, 0x3410), .driver_info = DEVICE_ZD1211B },
+       { USB_DEVICE(0x0baf, 0x0121), .driver_info = DEVICE_ZD1211B },
+       { USB_DEVICE(0x0586, 0x3412), .driver_info = DEVICE_ZD1211B },
        /* "Driverless" devices that need ejecting */
        { USB_DEVICE(0x0ace, 0x2011), .driver_info = DEVICE_INSTALLER },
        {}
@@ -313,6 +318,12 @@ out:
 
 static inline void handle_retry_failed_int(struct urb *urb)
 {
+       struct zd_usb *usb = urb->context;
+       struct zd_mac *mac = zd_usb_to_mac(usb);
+       struct ieee80211_device *ieee = zd_mac_to_ieee80211(mac);
+
+       ieee->stats.tx_errors++;
+       ieee->ieee_stats.tx_retry_limit_exceeded++;
        dev_dbg_f(urb_dev(urb), "retry failed interrupt\n");
 }
 
@@ -406,7 +417,7 @@ int zd_usb_enable_int(struct zd_usb *usb)
 
        dev_dbg_f(zd_usb_dev(usb), "\n");
 
-       urb = usb_alloc_urb(0, GFP_NOFS);
+       urb = usb_alloc_urb(0, GFP_KERNEL);
        if (!urb) {
                r = -ENOMEM;
                goto out;
@@ -424,7 +435,7 @@ int zd_usb_enable_int(struct zd_usb *usb)
 
        /* TODO: make it a DMA buffer */
        r = -ENOMEM;
-       transfer_buffer = kmalloc(USB_MAX_EP_INT_BUFFER, GFP_NOFS);
+       transfer_buffer = kmalloc(USB_MAX_EP_INT_BUFFER, GFP_KERNEL);
        if (!transfer_buffer) {
                dev_dbg_f(zd_usb_dev(usb),
                        "couldn't allocate transfer_buffer\n");
@@ -438,7 +449,7 @@ int zd_usb_enable_int(struct zd_usb *usb)
                         intr->interval);
 
        dev_dbg_f(zd_usb_dev(usb), "submit urb %p\n", intr->urb);
-       r = usb_submit_urb(urb, GFP_NOFS);
+       r = usb_submit_urb(urb, GFP_KERNEL);
        if (r) {
                dev_dbg_f(zd_usb_dev(usb),
                         "Couldn't submit urb. Error number %d\n", r);
@@ -487,6 +498,9 @@ static void handle_rx_packet(struct zd_usb *usb, const u8 *buffer,
 
        if (length < sizeof(struct rx_length_info)) {
                /* It's not a complete packet anyhow. */
+               struct ieee80211_device *ieee = zd_mac_to_ieee80211(mac);
+               ieee->stats.rx_errors++;
+               ieee->stats.rx_length_errors++;
                return;
        }
        length_info = (struct rx_length_info *)
@@ -584,10 +598,10 @@ static struct urb *alloc_urb(struct zd_usb *usb)
        struct urb *urb;
        void *buffer;
 
-       urb = usb_alloc_urb(0, GFP_NOFS);
+       urb = usb_alloc_urb(0, GFP_KERNEL);
        if (!urb)
                return NULL;
-       buffer = usb_buffer_alloc(udev, USB_MAX_RX_SIZE, GFP_NOFS,
+       buffer = usb_buffer_alloc(udev, USB_MAX_RX_SIZE, GFP_KERNEL,
                                  &urb->transfer_dma);
        if (!buffer) {
                usb_free_urb(urb);
@@ -620,7 +634,7 @@ int zd_usb_enable_rx(struct zd_usb *usb)
        dev_dbg_f(zd_usb_dev(usb), "\n");
 
        r = -ENOMEM;
-       urbs = kcalloc(URBS_COUNT, sizeof(struct urb *), GFP_NOFS);
+       urbs = kcalloc(URBS_COUNT, sizeof(struct urb *), GFP_KERNEL);
        if (!urbs)
                goto error;
        for (i = 0; i < URBS_COUNT; i++) {
@@ -641,7 +655,7 @@ int zd_usb_enable_rx(struct zd_usb *usb)
        spin_unlock_irq(&rx->lock);
 
        for (i = 0; i < URBS_COUNT; i++) {
-               r = usb_submit_urb(urbs[i], GFP_NOFS);
+               r = usb_submit_urb(urbs[i], GFP_KERNEL);
                if (r)
                        goto error_submit;
        }
@@ -923,6 +937,8 @@ static int probe(struct usb_interface *intf, const struct usb_device_id *id)
                goto error;
        }
 
+       usb_reset_device(interface_to_usbdev(intf));
+
        netdev = zd_netdev_alloc(intf);
        if (netdev == NULL) {
                r = -ENOMEM;
@@ -1024,6 +1040,7 @@ static int __init usb_init(void)
 
        r = usb_register(&driver);
        if (r) {
+               destroy_workqueue(zd_workqueue);
                printk(KERN_ERR "%s usb_register() failed. Error number %d\n",
                       driver.name, r);
                return r;
@@ -1144,7 +1161,7 @@ int zd_usb_ioread16v(struct zd_usb *usb, u16 *values,
        }
 
        req_len = sizeof(struct usb_req_read_regs) + count * sizeof(__le16);
-       req = kmalloc(req_len, GFP_NOFS);
+       req = kmalloc(req_len, GFP_KERNEL);
        if (!req)
                return -ENOMEM;
        req->id = cpu_to_le16(USB_REQ_READ_REGS);
@@ -1207,7 +1224,7 @@ int zd_usb_iowrite16v(struct zd_usb *usb, const struct zd_ioreq16 *ioreqs,
 
        req_len = sizeof(struct usb_req_write_regs) +
                  count * sizeof(struct reg_data);
-       req = kmalloc(req_len, GFP_NOFS);
+       req = kmalloc(req_len, GFP_KERNEL);
        if (!req)
                return -ENOMEM;
 
@@ -1287,7 +1304,7 @@ int zd_usb_rfwrite(struct zd_usb *usb, u32 value, u8 bits)
        bit_value_template &= ~(RF_IF_LE|RF_CLK|RF_DATA);
 
        req_len = sizeof(struct usb_req_rfwrite) + bits * sizeof(__le16);
-       req = kmalloc(req_len, GFP_NOFS);
+       req = kmalloc(req_len, GFP_KERNEL);
        if (!req)
                return -ENOMEM;