Add USB ID for Thomson SpeedTouch 120g to p54usb id table
[safe/jmp/linux-2.6] / drivers / net / wireless / p54 / p54usb.c
index 461d88f..e3cfc00 100644 (file)
@@ -35,7 +35,9 @@ MODULE_FIRMWARE("isl3887usb");
 static struct usb_device_id p54u_table[] __devinitdata = {
        /* Version 1 devices (pci chip + net2280) */
        {USB_DEVICE(0x0506, 0x0a11)},   /* 3COM 3CRWE254G72 */
+       {USB_DEVICE(0x06b9, 0x0120)},   /* Thomson SpeedTouch 120g */
        {USB_DEVICE(0x0707, 0xee06)},   /* SMC 2862W-G */
+       {USB_DEVICE(0x07aa, 0x001c)},   /* Corega CG-WLUSB2GT */
        {USB_DEVICE(0x083a, 0x4501)},   /* Accton 802.11g WN4501 USB */
        {USB_DEVICE(0x083a, 0x4502)},   /* Siemens Gigaset USB Adapter */
        {USB_DEVICE(0x083a, 0x5501)},   /* Phillips CPWUA054 */
@@ -60,6 +62,7 @@ static struct usb_device_id p54u_table[] __devinitdata = {
        {USB_DEVICE(0x06b9, 0x0121)},   /* Thomson SpeedTouch 121g */
        {USB_DEVICE(0x0707, 0xee13)},   /* SMC 2862W-G version 2 */
        {USB_DEVICE(0x083a, 0x4521)},   /* Siemens Gigaset USB Adapter 54 version 2 */
+       {USB_DEVICE(0x083a, 0xf503)},   /* Accton FD7050E ver 1010ec  */
        {USB_DEVICE(0x0846, 0x4240)},   /* Netgear WG111 (v2) */
        {USB_DEVICE(0x0915, 0x2000)},   /* Cohiba Proto board */
        {USB_DEVICE(0x0915, 0x2002)},   /* Cohiba Proto board */
@@ -67,6 +70,7 @@ static struct usb_device_id p54u_table[] __devinitdata = {
        {USB_DEVICE(0x0bf8, 0x1009)},   /* FUJITSU E-5400 USB D1700*/
        {USB_DEVICE(0x0cde, 0x0006)},   /* Medion MD40900 */
        {USB_DEVICE(0x0cde, 0x0008)},   /* Sagem XG703A */
+       {USB_DEVICE(0x0cde, 0x0015)},   /* Zcomax XG-705A */
        {USB_DEVICE(0x0d8e, 0x3762)},   /* DLink DWL-G120 Cohiba */
        {USB_DEVICE(0x124a, 0x4025)},   /* IOGear GWU513 (GW3887IK chip) */
        {USB_DEVICE(0x1260, 0xee22)},   /* SMC 2862W-G version 2 */
@@ -246,8 +250,10 @@ static void p54u_tx_lm87(struct ieee80211_hw *dev, struct sk_buff *skb)
        struct lm87_tx_hdr *hdr = (void *)skb->data - sizeof(*hdr);
 
        data_urb = usb_alloc_urb(0, GFP_ATOMIC);
-       if (!data_urb)
+       if (!data_urb) {
+               p54_free_skb(dev, skb);
                return;
+       }
 
        hdr->chksum = p54u_lm87_chksum((__le32 *)skb->data, skb->len);
        hdr->device_addr = ((struct p54_hdr *)skb->data)->req_id;
@@ -269,27 +275,22 @@ static void p54u_tx_lm87(struct ieee80211_hw *dev, struct sk_buff *skb)
 static void p54u_tx_net2280(struct ieee80211_hw *dev, struct sk_buff *skb)
 {
        struct p54u_priv *priv = dev->priv;
-       struct urb *int_urb, *data_urb;
+       struct urb *int_urb = NULL, *data_urb = NULL;
        struct net2280_tx_hdr *hdr = (void *)skb->data - sizeof(*hdr);
-       struct net2280_reg_write *reg;
-       int err = 0;
+       struct net2280_reg_write *reg = NULL;
+       int err = -ENOMEM;
 
        reg = kmalloc(sizeof(*reg), GFP_ATOMIC);
        if (!reg)
-               return;
+               goto out;
 
        int_urb = usb_alloc_urb(0, GFP_ATOMIC);
-       if (!int_urb) {
-               kfree(reg);
-               return;
-       }
+       if (!int_urb)
+               goto out;
 
        data_urb = usb_alloc_urb(0, GFP_ATOMIC);
-       if (!data_urb) {
-               kfree(reg);
-               usb_free_urb(int_urb);
-               return;
-       }
+       if (!data_urb)
+               goto out;
 
        reg->port = cpu_to_le16(NET2280_DEV_U32);
        reg->addr = cpu_to_le32(P54U_DEV_BASE);
@@ -304,11 +305,12 @@ static void p54u_tx_net2280(struct ieee80211_hw *dev, struct sk_buff *skb)
                p54u_tx_dummy_cb, dev);
 
        /*
-        * This flag triggers a code path in the USB subsystem that will
-        * free what's inside the transfer_buffer after the callback routine
-        * has completed.
+        * URB_FREE_BUFFER triggers a code path in the USB subsystem that will
+        * free what is inside the transfer_buffer after the last reference to
+        * the int_urb is dropped.
         */
        int_urb->transfer_flags |= URB_FREE_BUFFER | URB_ZERO_PACKET;
+       reg = NULL;
 
        usb_fill_bulk_urb(data_urb, priv->udev,
                          usb_sndbulkpipe(priv->udev, P54U_PIPE_DATA),
@@ -329,12 +331,12 @@ static void p54u_tx_net2280(struct ieee80211_hw *dev, struct sk_buff *skb)
                usb_unanchor_urb(data_urb);
                goto out;
        }
- out:
+out:
        usb_free_urb(int_urb);
        usb_free_urb(data_urb);
 
        if (err) {
-               skb_pull(skb, sizeof(*hdr));
+               kfree(reg);
                p54_free_skb(dev, skb);
        }
 }
@@ -427,12 +429,16 @@ static const char p54u_romboot_3887[] = "~~~~";
 static int p54u_firmware_reset_3887(struct ieee80211_hw *dev)
 {
        struct p54u_priv *priv = dev->priv;
-       u8 buf[4];
+       u8 *buf;
        int ret;
 
-       memcpy(&buf, p54u_romboot_3887, sizeof(buf));
+       buf = kmalloc(4, GFP_KERNEL);
+       if (!buf)
+               return -ENOMEM;
+       memcpy(buf, p54u_romboot_3887, 4);
        ret = p54u_bulk_msg(priv, P54U_PIPE_DATA,
-                           buf, sizeof(buf));
+                           buf, 4);
+       kfree(buf);
        if (ret)
                dev_err(&priv->udev->dev, "(p54usb) unable to jump to "
                        "boot ROM (%d)!\n", ret);