Merge to kernel-2.6.20-1.2949.fc6.vs2.2.0.1
[linux-2.6.git] / drivers / net / wireless / zd1201.c
similarity index 96%
rename from drivers/usb/net/zd1201.c
rename to drivers/net/wireless/zd1201.c
index f3a8e28..6cb66a3 100644 (file)
@@ -33,7 +33,7 @@ static struct usb_device_id zd1201_table[] = {
        {}
 };
 
-static int ap = 0;     /* Are we an AP or a normal station? */
+static int ap; /* Are we an AP or a normal station? */
 
 #define ZD1201_VERSION "0.15"
 
@@ -49,7 +49,7 @@ MODULE_DEVICE_TABLE(usb, zd1201_table);
 static int zd1201_fw_upload(struct usb_device *dev, int apfw)
 {
        const struct firmware *fw_entry;
-       chardata;
+       char *data;
        unsigned long len;
        int err;
        unsigned char ret;
@@ -65,7 +65,7 @@ static int zd1201_fw_upload(struct usb_device *dev, int apfw)
        if (err) {
                dev_err(&dev->dev, "Failed to load %s firmware file!\n", fwfile);
                dev_err(&dev->dev, "Make sure the hotplug firmware loader is installed.\n");
-               dev_err(&dev->dev, "Goto http://linux-lc100020.sourceforge.net for more info\n");
+               dev_err(&dev->dev, "Goto http://linux-lc100020.sourceforge.net for more info.\n");
                return err;
        }
 
@@ -94,12 +94,12 @@ static int zd1201_fw_upload(struct usb_device *dev, int apfw)
            USB_DIR_OUT | 0x40, 0, 0, NULL, 0, ZD1201_FW_TIMEOUT);
        if (err < 0)
                goto exit;
-                                                                                                                                                                
+
        err = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0), 0x4,
            USB_DIR_IN | 0x40, 0,0, &ret, sizeof(ret), ZD1201_FW_TIMEOUT);
        if (err < 0)
                goto exit;
-                                                                                                                                                                                                                                                                                        
+
        if (ret & 0x80) {
                err = -EIO;
                goto exit;
@@ -112,14 +112,14 @@ exit:
        return err;
 }
 
-static void zd1201_usbfree(struct urb *urb, struct pt_regs *regs)
+static void zd1201_usbfree(struct urb *urb)
 {
        struct zd1201 *zd = urb->context;
 
        switch(urb->status) {
                case -EILSEQ:
                case -ENODEV:
-               case -ETIMEDOUT:
+               case -ETIME:
                case -ENOENT:
                case -EPIPE:
                case -EOVERFLOW:
@@ -166,18 +166,18 @@ static int zd1201_docmd(struct zd1201 *zd, int cmd, int parm0,
                return -ENOMEM;
        }
        usb_fill_bulk_urb(urb, zd->usb, usb_sndbulkpipe(zd->usb, zd->endp_out2),
-            command, 16, zd1201_usbfree, zd);
+                         command, 16, zd1201_usbfree, zd);
        ret = usb_submit_urb(urb, GFP_ATOMIC);
        if (ret) {
                kfree(command);
                usb_free_urb(urb);
        }
-       
+
        return ret;
 }
 
 /* Callback after sending out a packet */
-static void zd1201_usbtx(struct urb *urb, struct pt_regs *regs)
+static void zd1201_usbtx(struct urb *urb)
 {
        struct zd1201 *zd = urb->context;
        netif_wake_queue(zd->dev);
@@ -185,7 +185,7 @@ static void zd1201_usbtx(struct urb *urb, struct pt_regs *regs)
 }
 
 /* Incoming data */
-static void zd1201_usbrx(struct urb *urb, struct pt_regs *regs)
+static void zd1201_usbrx(struct urb *urb)
 {
        struct zd1201 *zd = urb->context;
        int free = 0;
@@ -193,15 +193,13 @@ static void zd1201_usbrx(struct urb *urb, struct pt_regs *regs)
        struct sk_buff *skb;
        unsigned char type;
 
-       if (!zd) {
-               free = 1;
-               goto exit;
-       }
+       if (!zd)
+               return;
 
        switch(urb->status) {
                case -EILSEQ:
                case -ENODEV:
-               case -ETIMEDOUT:
+               case -ETIME:
                case -ENOENT:
                case -EPIPE:
                case -EOVERFLOW:
@@ -316,7 +314,7 @@ static void zd1201_usbrx(struct urb *urb, struct pt_regs *regs)
                fc = le16_to_cpu(*(__le16 *)&data[datalen-16]);
                seq = le16_to_cpu(*(__le16 *)&data[datalen-24]);
 
-               if(zd->monitor) {
+               if (zd->monitor) {
                        if (datalen < 24)
                                goto resubmit;
                        if (!(skb = dev_alloc_skb(datalen+24)))
@@ -364,7 +362,7 @@ static void zd1201_usbrx(struct urb *urb, struct pt_regs *regs)
                                goto resubmit;
                        }
                        hlist_for_each_entry(frag, node, &zd->fraglist, fnode)
-                               if(frag->seq == (seq&IEEE80211_SCTL_SEQ))
+                               if (frag->seq == (seq&IEEE80211_SCTL_SEQ))
                                        break;
                        if (!frag)
                                goto resubmit;
@@ -376,7 +374,6 @@ static void zd1201_usbrx(struct urb *urb, struct pt_regs *regs)
                                goto resubmit;
                        hlist_del_init(&frag->fnode);
                        kfree(frag);
-                       /* Fallthrough */
                } else {
                        if (datalen<14)
                                goto resubmit;
@@ -422,7 +419,7 @@ static int zd1201_getconfig(struct zd1201 *zd, int rid, void *riddata,
        int rid_fid;
        int length;
        unsigned char *pdata;
-       
+
        zd->rxdatas = 0;
        err = zd1201_docmd(zd, ZD1201_CMDCODE_ACCESS, rid, 0, 0);
        if (err)
@@ -471,11 +468,11 @@ static int zd1201_getconfig(struct zd1201 *zd, int rid, void *riddata,
        length = zd->rxlen;
 
        do {
-               int  actual_length;
+               int actual_length;
 
                actual_length = (length > 64) ? 64 : length;
 
-               if(pdata[0] != 0x3) {
+               if (pdata[0] != 0x3) {
                        dev_dbg(&zd->usb->dev, "Rx Resource packet type error: %02X\n",
                            pdata[0]);
                        return -EINVAL;
@@ -487,11 +484,10 @@ static int zd1201_getconfig(struct zd1201 *zd, int rid, void *riddata,
                }
 
                /* Skip the 4 bytes header (RID length and RID) */
-               if(i == 0) {
+               if (i == 0) {
                        pdata += 8;
                        actual_length -= 8;
-               }
-               else {
+               } else {
                        pdata += 4;
                        actual_length -= 4;
                }
@@ -620,11 +616,10 @@ static int zd1201_drvr_start(struct zd1201 *zd)
        short max;
        __le16 zdmax;
        unsigned char *buffer;
-       
-       buffer = kmalloc(ZD1201_RXSIZE, GFP_KERNEL);
+
+       buffer = kzalloc(ZD1201_RXSIZE, GFP_KERNEL);
        if (!buffer)
                return -ENOMEM;
-       memset(buffer, 0, ZD1201_RXSIZE);
 
        usb_fill_bulk_urb(zd->rx_urb, zd->usb, 
            usb_rcvbulkpipe(zd->usb, zd->endp_in), buffer, ZD1201_RXSIZE,
@@ -633,7 +628,7 @@ static int zd1201_drvr_start(struct zd1201 *zd)
        err = usb_submit_urb(zd->rx_urb, GFP_KERNEL);
        if (err)
                goto err_buffer;
-       
+
        err = zd1201_docmd(zd, ZD1201_CMDCODE_INIT, 0, 0, 0);
        if (err)
                goto err_urb;
@@ -685,7 +680,7 @@ static int zd1201_enable(struct zd1201 *zd)
 static int zd1201_disable(struct zd1201 *zd)
 {
        int err;
-       
+
        if (!zd->mac_enabled)
                return 0;
        if (zd->monitor) {
@@ -765,7 +760,6 @@ static int zd1201_net_open(struct net_device *dev)
 static int zd1201_net_stop(struct net_device *dev)
 {
        netif_stop_queue(dev);
-       
        return 0;
 }
 
@@ -916,7 +910,6 @@ static int zd1201_get_name(struct net_device *dev,
     struct iw_request_info *info, char *name, char *extra)
 {
        strcpy(name, "IEEE 802.11b");
-
        return 0;
 }
 
@@ -1014,11 +1007,10 @@ static int zd1201_set_mode(struct net_device *dev,
                        if (err)
                                return err;
        }
-       zd->monitor=monitor;
+       zd->monitor = monitor;
        /* If monitor mode is set we don't actually turn it on here since it
         * is done during mac reset anyway (see zd1201_mac_enable).
         */
-
        zd1201_mac_reset(zd);
 
        return 0;
@@ -1118,7 +1110,7 @@ static int zd1201_get_wap(struct net_device *dev,
                zd->iwstats.qual.updated = 2;
        }
 
-       return zd1201_getconfig(zd,ZD1201_RID_CURRENTBSSID,ap_addr->sa_data,6);
+       return zd1201_getconfig(zd, ZD1201_RID_CURRENTBSSID, ap_addr->sa_data, 6);
 }
 
 static int zd1201_set_scan(struct net_device *dev,
@@ -1224,7 +1216,7 @@ static int zd1201_set_essid(struct net_device *dev,
                return -EINVAL;
        if (data->length < 1)
                data->length = 1;
-       zd->essidlen = data->length-1;
+       zd->essidlen = data->length;
        memset(zd->essid, 0, IW_ESSID_MAX_SIZE+1);
        memcpy(zd->essid, essid, data->length);
        return zd1201_join(zd, zd->essid, zd->essidlen);
@@ -1276,7 +1268,7 @@ static int zd1201_set_rate(struct net_device *dev,
        if (!rrq->fixed) { /* Also enable all lower bitrates */
                rate |= rate-1;
        }
-       
+
        err = zd1201_setconfig16(zd, ZD1201_RID_TXRATECNTL, rate);
        if (err)
                return err;
@@ -1487,7 +1479,7 @@ static int zd1201_get_encode(struct net_device *dev,
                return -EINVAL;
 
        erq->flags |= i+1;
-       
+
        erq->length = zd->encode_keylen[i];
        memcpy(key, zd->encode_keys[i], erq->length);
 
@@ -1530,11 +1522,7 @@ static int zd1201_set_power(struct net_device *dev,
                return -EINVAL;
        }
 out:
-       err = zd1201_setconfig16(zd, ZD1201_RID_CNFPMENABLED, enabled);
-       if (err)
-               return err;
-
-       return 0;
+       return zd1201_setconfig16(zd, ZD1201_RID_CNFPMENABLED, enabled);
 }
 
 static int zd1201_get_power(struct net_device *dev,
@@ -1628,15 +1616,11 @@ static int zd1201_set_hostauth(struct net_device *dev,
     struct iw_request_info *info, struct iw_param *rrq, char *extra)
 {
        struct zd1201 *zd = (struct zd1201 *)dev->priv;
-       int err;
 
        if (!zd->ap)
                return -EOPNOTSUPP;
 
-       err = zd1201_setconfig16(zd, ZD1201_RID_CNFHOSTAUTH, rrq->value);
-       if (err)
-               return err;
-       return 0;
+       return zd1201_setconfig16(zd, ZD1201_RID_CNFHOSTAUTH, rrq->value);
 }
 
 static int zd1201_get_hostauth(struct net_device *dev,
@@ -1737,6 +1721,7 @@ static const struct iw_handler_def zd1201_iw_handlers = {
        .standard               = (iw_handler *)zd1201_iw_handler,
        .private                = (iw_handler *)zd1201_private_handler,
        .private_args           = (struct iw_priv_args *) zd1201_private_args,
+       .get_wireless_stats     = zd1201_get_wireless_stats,
 };
 
 static int zd1201_probe(struct usb_interface *interface,
@@ -1744,17 +1729,15 @@ static int zd1201_probe(struct usb_interface *interface,
 {
        struct zd1201 *zd;
        struct usb_device *usb;
-       int i, err;
+       int err;
        short porttype;
        char buf[IW_ESSID_MAX_SIZE+2];
 
        usb = interface_to_usbdev(interface);
 
-       zd = kmalloc(sizeof(struct zd1201), GFP_KERNEL);
-       if (!zd) {
+       zd = kzalloc(sizeof(struct zd1201), GFP_KERNEL);
+       if (!zd)
                return -ENOMEM;
-       }
-       memset(zd, 0, sizeof(struct zd1201));
        zd->ap = ap;
        zd->usb = usb;
        zd->removed = 0;
@@ -1775,9 +1758,7 @@ static int zd1201_probe(struct usb_interface *interface,
        if (!zd->rx_urb || !zd->tx_urb)
                goto err_zd;
 
-       for(i = 0; i<100; i++)
-               udelay(1000);
-
+       mdelay(100);
        err = zd1201_drvr_start(zd);
        if (err)
                goto err_zd;
@@ -1799,7 +1780,6 @@ static int zd1201_probe(struct usb_interface *interface,
        zd->dev->open = zd1201_net_open;
        zd->dev->stop = zd1201_net_stop;
        zd->dev->get_stats = zd1201_get_stats;
-       zd->dev->get_wireless_stats = zd1201_get_wireless_stats;
        zd->dev->wireless_handlers =
            (struct iw_handler_def *)&zd1201_iw_handlers;
        zd->dev->hard_start_xmit = zd1201_hard_start_xmit;
@@ -1836,8 +1816,10 @@ static int zd1201_probe(struct usb_interface *interface,
                goto err_net;
        dev_info(&usb->dev, "%s: ZD1201 USB Wireless interface\n",
            zd->dev->name);
-       
+
        usb_set_intfdata(interface, zd);
+       zd1201_enable(zd);      /* zd1201 likes to startup enabled, */
+       zd1201_disable(zd);     /* interfering with all the wifis in range */
        return 0;
 
 err_net:
@@ -1846,10 +1828,8 @@ err_start:
        /* Leave the device in reset state */
        zd1201_docmd(zd, ZD1201_CMDCODE_INIT, 0, 0, 0);
 err_zd:
-       if (zd->tx_urb)
-               usb_free_urb(zd->tx_urb);
-       if (zd->rx_urb)
-               usb_free_urb(zd->rx_urb);
+       usb_free_urb(zd->tx_urb);
+       usb_free_urb(zd->rx_urb);
        kfree(zd);
        return err;
 }