]> err.no Git - linux-2.6/blobdiff - drivers/net/wireless/zd1211rw/zd_usb.c
Merge branch 'for-2.6.26' of master.kernel.org:/pub/scm/linux/kernel/git/jwboyer...
[linux-2.6] / drivers / net / wireless / zd1211rw / zd_usb.c
index 7942b15acfe7019bc604ccc442b066b56107c36b..5316074f39f0b0c28e73ace87813ecb0e3883ef6 100644 (file)
@@ -97,6 +97,7 @@ MODULE_DEVICE_TABLE(usb, usb_ids);
 #define FW_ZD1211B_PREFIX      "zd1211/zd1211b_"
 
 /* USB device initialization */
+static void int_urb_complete(struct urb *urb);
 
 static int request_fw_file(
        const struct firmware **fw, const char *name, struct device *device)
@@ -336,11 +337,18 @@ static inline void handle_regs_int(struct urb *urb)
        struct zd_usb *usb = urb->context;
        struct zd_usb_interrupt *intr = &usb->intr;
        int len;
+       u16 int_num;
 
        ZD_ASSERT(in_interrupt());
        spin_lock(&intr->lock);
 
-       if (intr->read_regs_enabled) {
+       int_num = le16_to_cpu(*(u16 *)(urb->transfer_buffer+2));
+       if (int_num == CR_INTERRUPT) {
+               struct zd_mac *mac = zd_hw_mac(zd_usb_to_hw(urb->context));
+               memcpy(&mac->intr_buffer, urb->transfer_buffer,
+                               USB_MAX_EP_INT_BUFFER);
+               schedule_work(&mac->process_intr);
+       } else if (intr->read_regs_enabled) {
                intr->read_regs.length = len = urb->actual_length;
 
                if (len > sizeof(intr->read_regs.buffer))
@@ -351,7 +359,6 @@ static inline void handle_regs_int(struct urb *urb)
                goto out;
        }
 
-       dev_dbg_f(urb_dev(urb), "regs interrupt ignored\n");
 out:
        spin_unlock(&intr->lock);
 }
@@ -538,11 +545,11 @@ static void handle_rx_packet(struct zd_usb *usb, const u8 *buffer,
         * be padded. Unaligned access might also happen if the length_info
         * structure is not present.
         */
-       if (get_unaligned(&length_info->tag) == cpu_to_le16(RX_LENGTH_INFO_TAG))
+       if (get_unaligned_le16(&length_info->tag) == RX_LENGTH_INFO_TAG)
        {
                unsigned int l, k, n;
                for (i = 0, l = 0;; i++) {
-                       k = le16_to_cpu(get_unaligned(&length_info->length[i]));
+                       k = get_unaligned_le16(&length_info->length[i]);
                        if (k == 0)
                                return;
                        n = l+k;