aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorJason Andryuk <jandryuk@gmail.com>2009-02-21 02:53:22 -0500
committerJohn W. Linville <linville@tuxdriver.com>2009-02-27 14:53:01 -0500
commit5a2137ddcc4b4d0d9227db433eabaefa3c3bd924 (patch)
tree3ca922c4dca135041ea9e6f9d0b6799660bbb2ee /drivers
parentdeda862e699f0aba6f0975e138a0258d1b29f2df (diff)
at76c50x-usb: clean up DMA on stack
Cleanup dma on stack issues: - no DMA on stack - cleanup unclear endianness issue Corrected version of Oliver Neukum's original patch for at76_usb. Signed-off-by: Jason Andryuk <jandryuk@gmail.com> Signed-off-by: Kalle Valo <kalle.valo@iki.fi> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/net/wireless/at76c50x-usb.c35
1 files changed, 23 insertions, 12 deletions
diff --git a/drivers/net/wireless/at76c50x-usb.c b/drivers/net/wireless/at76c50x-usb.c
index c79591ee2055..46ac9e278035 100644
--- a/drivers/net/wireless/at76c50x-usb.c
+++ b/drivers/net/wireless/at76c50x-usb.c
@@ -580,18 +580,25 @@ static int at76_remap(struct usb_device *udev)
580static int at76_get_op_mode(struct usb_device *udev) 580static int at76_get_op_mode(struct usb_device *udev)
581{ 581{
582 int ret; 582 int ret;
583 u8 op_mode; 583 u8 saved;
584 u8 *op_mode;
584 585
586 op_mode = kmalloc(1, GFP_NOIO);
587 if (!op_mode)
588 return -ENOMEM;
585 ret = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), 0x33, 589 ret = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), 0x33,
586 USB_TYPE_VENDOR | USB_DIR_IN | 590 USB_TYPE_VENDOR | USB_DIR_IN |
587 USB_RECIP_INTERFACE, 0x01, 0, &op_mode, 1, 591 USB_RECIP_INTERFACE, 0x01, 0, op_mode, 1,
588 USB_CTRL_GET_TIMEOUT); 592 USB_CTRL_GET_TIMEOUT);
593 saved = *op_mode;
594 kfree(op_mode);
595
589 if (ret < 0) 596 if (ret < 0)
590 return ret; 597 return ret;
591 else if (ret < 1) 598 else if (ret < 1)
592 return -EIO; 599 return -EIO;
593 else 600 else
594 return op_mode; 601 return saved;
595} 602}
596 603
597/* Load a block of the second ("external") part of the firmware */ 604/* Load a block of the second ("external") part of the firmware */
@@ -704,21 +711,25 @@ static inline int at76_get_mib(struct usb_device *udev, u16 mib, void *buf,
704/* Return positive number for status, negative for an error */ 711/* Return positive number for status, negative for an error */
705static inline int at76_get_cmd_status(struct usb_device *udev, u8 cmd) 712static inline int at76_get_cmd_status(struct usb_device *udev, u8 cmd)
706{ 713{
707 u8 stat_buf[40]; 714 u8 *stat_buf;
708 int ret; 715 int ret;
709 716
717 stat_buf = kmalloc(40, GFP_NOIO);
718 if (!stat_buf)
719 return -ENOMEM;
720
710 ret = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), 0x22, 721 ret = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), 0x22,
711 USB_TYPE_VENDOR | USB_DIR_IN | 722 USB_TYPE_VENDOR | USB_DIR_IN |
712 USB_RECIP_INTERFACE, cmd, 0, stat_buf, 723 USB_RECIP_INTERFACE, cmd, 0, stat_buf,
713 sizeof(stat_buf), USB_CTRL_GET_TIMEOUT); 724 40, USB_CTRL_GET_TIMEOUT);
714 if (ret < 0) 725 if (ret >= 0)
715 return ret; 726 ret = stat_buf[5];
727 kfree(stat_buf);
716 728
717 return stat_buf[5]; 729 return ret;
718} 730}
719 731
720#define MAKE_CMD_CASE(c) case (c): return #c 732#define MAKE_CMD_CASE(c) case (c): return #c
721
722static const char *at76_get_cmd_string(u8 cmd_status) 733static const char *at76_get_cmd_string(u8 cmd_status)
723{ 734{
724 switch (cmd_status) { 735 switch (cmd_status) {
@@ -735,7 +746,7 @@ static const char *at76_get_cmd_string(u8 cmd_status)
735 return "UNKNOWN"; 746 return "UNKNOWN";
736} 747}
737 748
738static int at76_set_card_command(struct usb_device *udev, int cmd, void *buf, 749static int at76_set_card_command(struct usb_device *udev, u8 cmd, void *buf,
739 int buf_size) 750 int buf_size)
740{ 751{
741 int ret; 752 int ret;