diff for duplicates of <200812081506.54173.chunkeey@web.de> diff --git a/a/1.txt b/N1/1.txt index aed3b40..250147b 100644 --- a/a/1.txt +++ b/N1/1.txt @@ -1,70 +1,60 @@ -Alan Stern found several flaws in p54usb's implementation and annotated= -:=20 +Alan Stern found several flaws in p54usb's implementation and annotated: "usb_kill_urb() and similar routines do not expect an URB's completion -routine to deallocate it. =A0This is almost obvious -- if the URB is de= -allocated -before the completion routine returns then there's no way for usb_kill_= -urb +routine to deallocate it. This is almost obvious -- if the URB is deallocated +before the completion routine returns then there's no way for usb_kill_urb to detect when the URB actually is complete." -I really hope this patch addresses all of Alan's comments and fixes the= -=20 +I really hope this patch addresses all of Alan's comments and fixes the "use-after-freed" hang, when SLUB debug's poisoning option is enabled. --- -> I looked quickly at your new code. It seems basically right, but the= -re -> are few things that still need attention. For instance, you removed = -a +> I looked quickly at your new code. It seems basically right, but there +> are few things that still need attention. For instance, you removed a > line to free an URB's transfer buffer. yeah, it was there in the last patch, but probably in the wrong place. Anyway, there's now a small comment so it's easier to spot it. -So here's the new "final" version, unless someone files a complain with= -in 24 hours.=20 +So here's the new "final" version, unless someone files a complain within 24 hours. --- -diff -Nurp a/drivers/net/wireless/p54/p54usb.c b/drivers/net/wireless/p= -54/p54usb.c ---- a/drivers/net/wireless/p54/p54usb.c 2008-12-07 21:21:04.017774898 += -0100 -+++ b/drivers/net/wireless/p54/p54usb.c 2008-12-08 14:17:51.863521490 += -0100 +diff -Nurp a/drivers/net/wireless/p54/p54usb.c b/drivers/net/wireless/p54/p54usb.c +--- a/drivers/net/wireless/p54/p54usb.c 2008-12-07 21:21:04.017774898 +0100 ++++ b/drivers/net/wireless/p54/p54usb.c 2008-12-08 14:17:51.863521490 +0100 @@ -86,13 +86,13 @@ static void p54u_rx_cb(struct urb *urb) - struct ieee80211_hw *dev =3D info->dev; - struct p54u_priv *priv =3D dev->priv; -=20 + struct ieee80211_hw *dev = info->dev; + struct p54u_priv *priv = dev->priv; + + skb_unlink(skb, &priv->rx_queue); + if (unlikely(urb->status)) { -- info->urb =3D NULL; +- info->urb = NULL; - usb_free_urb(urb); + dev_kfree_skb_irq(skb); return; } -=20 + - skb_unlink(skb, &priv->rx_queue); skb_put(skb, urb->actual_length); -=20 - if (priv->hw_type =3D=3D P54U_NET2280) + + if (priv->hw_type == P54U_NET2280) @@ -105,7 +105,6 @@ static void p54u_rx_cb(struct urb *urb) if (p54_rx(dev, skb)) { - skb =3D dev_alloc_skb(priv->common.rx_mtu + 32); + skb = dev_alloc_skb(priv->common.rx_mtu + 32); if (unlikely(!skb)) { - usb_free_urb(urb); /* TODO check rx queue length and refill *somewhere* */ return; } @@ -115,7 +114,6 @@ static void p54u_rx_cb(struct urb *urb) - info->dev =3D dev; - urb->transfer_buffer =3D skb_tail_pointer(skb); - urb->context =3D skb; + info->dev = dev; + urb->transfer_buffer = skb_tail_pointer(skb); + urb->context = skb; - skb_queue_tail(&priv->rx_queue, skb); } else { - if (priv->hw_type =3D=3D P54U_NET2280) + if (priv->hw_type == P54U_NET2280) skb_push(skb, priv->common.tx_hdr_len); @@ -130,11 +128,14 @@ static void p54u_rx_cb(struct urb *urb) WARN_ON(1); - urb->transfer_buffer =3D skb_tail_pointer(skb); + urb->transfer_buffer = skb_tail_pointer(skb); } - - skb_queue_tail(&priv->rx_queue, skb); @@ -79,11 +69,11 @@ diff -Nurp a/drivers/net/wireless/p54/p54usb.c b/drivers/net/wireless/p= + dev_kfree_skb_irq(skb); + } } -=20 + static void p54u_tx_reuse_skb_cb(struct urb *urb) -@@ -144,18 +145,6 @@ static void p54u_tx_reuse_skb_cb(struct=20 +@@ -144,18 +145,6 @@ static void p54u_tx_reuse_skb_cb(struct usb_get_intfdata(usb_ifnum_to_if(urb->dev, 0)))->priv; -=20 + skb_pull(skb, priv->common.tx_hdr_len); - usb_free_urb(urb); -} @@ -98,11 +88,11 @@ diff -Nurp a/drivers/net/wireless/p54/p54usb.c b/drivers/net/wireless/p= - kfree(urb->transfer_buffer); - usb_free_urb(urb); } -=20 + static void p54u_tx_free_skb_cb(struct urb *urb) @@ -165,25 +154,36 @@ static void p54u_tx_free_skb_cb(struct u usb_get_intfdata(usb_ifnum_to_if(urb->dev, 0)); -=20 + p54_free_skb(dev, skb); - usb_free_urb(urb); +} @@ -111,32 +101,32 @@ diff -Nurp a/drivers/net/wireless/p54/p54usb.c b/drivers/net/wireless/p= + +static void p54u_free_urbs(struct ieee80211_hw *dev) +{ -+ struct p54u_priv *priv =3D dev->priv; ++ struct p54u_priv *priv = dev->priv; + usb_kill_anchored_urbs(&priv->submitted); } -=20 + static int p54u_init_urbs(struct ieee80211_hw *dev) { - struct p54u_priv *priv =3D dev->priv; + struct p54u_priv *priv = dev->priv; - struct urb *entry; -+ struct urb *entry =3D NULL; ++ struct urb *entry = NULL; struct sk_buff *skb; struct p54u_rx_info *info; -+ int ret =3D 0; -=20 ++ int ret = 0; + while (skb_queue_len(&priv->rx_queue) < 32) { - skb =3D __dev_alloc_skb(priv->common.rx_mtu + 32, GFP_KERNEL); + skb = __dev_alloc_skb(priv->common.rx_mtu + 32, GFP_KERNEL); - if (!skb) - break; + if (!skb) { -+ ret =3D -ENOMEM; ++ ret = -ENOMEM; + goto err; + } - entry =3D usb_alloc_urb(0, GFP_KERNEL); + entry = usb_alloc_urb(0, GFP_KERNEL); if (!entry) { - kfree_skb(skb); - break; -+ ret =3D -ENOMEM; ++ ret = -ENOMEM; + goto err; } + @@ -144,33 +134,33 @@ diff -Nurp a/drivers/net/wireless/p54/p54usb.c b/drivers/net/wireless/p= usb_rcvbulkpipe(priv->udev, P54U_PIPE_DATA), skb_tail_pointer(skb), @@ -192,26 +192,25 @@ static int p54u_init_urbs(struct ieee802 - info->urb =3D entry; - info->dev =3D dev; + info->urb = entry; + info->dev = dev; skb_queue_tail(&priv->rx_queue, skb); - usb_submit_urb(entry, GFP_KERNEL); + + usb_anchor_urb(entry, &priv->submitted); -+ ret =3D usb_submit_urb(entry, GFP_KERNEL); ++ ret = usb_submit_urb(entry, GFP_KERNEL); + if (ret) { + skb_unlink(skb, &priv->rx_queue); + usb_unanchor_urb(entry); + goto err; + } + usb_free_urb(entry); -+ entry =3D NULL; ++ entry = NULL; } -=20 + return 0; -} -=20 + -static void p54u_free_urbs(struct ieee80211_hw *dev) -{ -- struct p54u_priv *priv =3D dev->priv; +- struct p54u_priv *priv = dev->priv; - struct p54u_rx_info *info; - struct sk_buff *skb; - -- while ((skb =3D skb_dequeue(&priv->rx_queue))) { -- info =3D (struct p54u_rx_info *) skb->cb; +- while ((skb = skb_dequeue(&priv->rx_queue))) { +- info = (struct p54u_rx_info *) skb->cb; - if (!info->urb) - continue; - @@ -183,16 +173,15 @@ diff -Nurp a/drivers/net/wireless/p54/p54usb.c b/drivers/net/wireless/p= + p54u_free_urbs(dev); + return ret; } -=20 - static void p54u_tx_3887(struct ieee80211_hw *dev, struct sk_buff *skb= -, + + static void p54u_tx_3887(struct ieee80211_hw *dev, struct sk_buff *skb, @@ -219,6 +218,7 @@ static void p54u_tx_3887(struct ieee8021 { - struct p54u_priv *priv =3D dev->priv; + struct p54u_priv *priv = dev->priv; struct urb *addr_urb, *data_urb; -+ int err =3D 0; -=20 - addr_urb =3D usb_alloc_urb(0, GFP_ATOMIC); ++ int err = 0; + + addr_urb = usb_alloc_urb(0, GFP_ATOMIC); if (!addr_urb) @@ -233,15 +233,31 @@ static void p54u_tx_3887(struct ieee8021 usb_fill_bulk_urb(addr_urb, priv->udev, @@ -205,18 +194,18 @@ diff -Nurp a/drivers/net/wireless/p54/p54usb.c b/drivers/net/wireless/p= skb->data, skb->len, free_on_tx ? p54u_tx_free_skb_cb : p54u_tx_reuse_skb_cb, skb); -=20 + - usb_submit_urb(addr_urb, GFP_ATOMIC); - usb_submit_urb(data_urb, GFP_ATOMIC); + usb_anchor_urb(addr_urb, &priv->submitted); -+ err =3D usb_submit_urb(addr_urb, GFP_ATOMIC); ++ err = usb_submit_urb(addr_urb, GFP_ATOMIC); + if (err) { + usb_unanchor_urb(addr_urb); + goto out; + } + + usb_anchor_urb(addr_urb, &priv->submitted); -+ err =3D usb_submit_urb(data_urb, GFP_ATOMIC); ++ err = usb_submit_urb(data_urb, GFP_ATOMIC); + if (err) + usb_unanchor_urb(data_urb); + @@ -227,12 +216,12 @@ diff -Nurp a/drivers/net/wireless/p54/p54usb.c b/drivers/net/wireless/p= + if (err) + p54_free_skb(dev, skb); } -=20 + static __le32 p54u_lm87_chksum(const __le32 *data, size_t length) @@ -281,7 +297,13 @@ static void p54u_tx_lm87(struct ieee8021 free_on_tx ? p54u_tx_free_skb_cb : p54u_tx_reuse_skb_cb, skb); -=20 + - usb_submit_urb(data_urb, GFP_ATOMIC); + usb_anchor_urb(data_urb, &priv->submitted); + if (usb_submit_urb(data_urb, GFP_ATOMIC)) { @@ -242,19 +231,18 @@ diff -Nurp a/drivers/net/wireless/p54/p54usb.c b/drivers/net/wireless/p= + } + usb_free_urb(data_urb); } -=20 - static void p54u_tx_net2280(struct ieee80211_hw *dev, struct sk_buff *= -skb, + + static void p54u_tx_net2280(struct ieee80211_hw *dev, struct sk_buff *skb, @@ -291,6 +313,7 @@ static void p54u_tx_net2280(struct ieee8 struct urb *int_urb, *data_urb; struct net2280_tx_hdr *hdr; struct net2280_reg_write *reg; -+ int err =3D 0; -=20 - reg =3D kmalloc(sizeof(*reg), GFP_ATOMIC); ++ int err = 0; + + reg = kmalloc(sizeof(*reg), GFP_ATOMIC); if (!reg) @@ -320,15 +343,42 @@ static void p54u_tx_net2280(struct ieee8 -=20 + usb_fill_bulk_urb(int_urb, priv->udev, usb_sndbulkpipe(priv->udev, P54U_PIPE_DEV), reg, sizeof(*reg), - p54u_tx_free_cb, dev); @@ -266,8 +254,8 @@ skb, + * free what's inside the transfer_buffer after the callback routine + * has completed. + */ -+ int_urb->transfer_flags |=3D URB_FREE_BUFFER; -=20 ++ int_urb->transfer_flags |= URB_FREE_BUFFER; + usb_fill_bulk_urb(data_urb, priv->udev, usb_sndbulkpipe(priv->udev, P54U_PIPE_DATA), skb->data, skb->len, @@ -276,14 +264,14 @@ skb, - usb_submit_urb(data_urb, GFP_ATOMIC); + + usb_anchor_urb(int_urb, &priv->submitted); -+ err =3D usb_submit_urb(int_urb, GFP_ATOMIC); ++ err = usb_submit_urb(int_urb, GFP_ATOMIC); + if (err) { + usb_unanchor_urb(int_urb); + goto out; + } + + usb_anchor_urb(data_urb, &priv->submitted); -+ err =3D usb_submit_urb(data_urb, GFP_ATOMIC); ++ err = usb_submit_urb(data_urb, GFP_ATOMIC); + if (err) { + usb_unanchor_urb(data_urb); + goto out; @@ -297,32 +285,24 @@ skb, + p54_free_skb(dev, skb); + } } -=20 + static int p54u_write(struct p54u_priv *priv, @@ -886,6 +936,7 @@ static int __devinit p54u_probe(struct u goto err_free_dev; -=20 + skb_queue_head_init(&priv->rx_queue); + init_usb_anchor(&priv->submitted); -=20 + p54u_open(dev); - err =3D p54_read_eeprom(dev); -diff -Nurp a/drivers/net/wireless/p54/p54usb.h b/drivers/net/wireless/p= -54/p54usb.h ---- a/drivers/net/wireless/p54/p54usb.h 2008-12-07 21:21:04.017774898 += -0100 -+++ b/drivers/net/wireless/p54/p54usb.h 2008-12-07 22:04:45.956897502 += -0100 + err = p54_read_eeprom(dev); +diff -Nurp a/drivers/net/wireless/p54/p54usb.h b/drivers/net/wireless/p54/p54usb.h +--- a/drivers/net/wireless/p54/p54usb.h 2008-12-07 21:21:04.017774898 +0100 ++++ b/drivers/net/wireless/p54/p54usb.h 2008-12-07 22:04:45.956897502 +0100 @@ -133,6 +133,7 @@ struct p54u_priv { -=20 + spinlock_t lock; struct sk_buff_head rx_queue; + struct usb_anchor submitted; }; -=20 + #endif /* P54USB_H */ --- -To unsubscribe from this list: send the line "unsubscribe linux-wireles= -s" in -the body of a message to majordomo@vger.kernel.org -More majordomo info at http://vger.kernel.org/majordomo-info.html diff --git a/a/content_digest b/N1/content_digest index 8757bc3..e32d1eb 100644 --- a/a/content_digest +++ b/N1/content_digest @@ -12,73 +12,63 @@ " linux-kernel@vger.kernel.org\0" "\00:1\0" "b\0" - "Alan Stern found several flaws in p54usb's implementation and annotated=\n" - ":=20\n" + "Alan Stern found several flaws in p54usb's implementation and annotated: \n" "\"usb_kill_urb() and similar routines do not expect an URB's completion\n" - "routine to deallocate it. =A0This is almost obvious -- if the URB is de=\n" - "allocated\n" - "before the completion routine returns then there's no way for usb_kill_=\n" - "urb\n" + "routine to deallocate it. \302\240This is almost obvious -- if the URB is deallocated\n" + "before the completion routine returns then there's no way for usb_kill_urb\n" "to detect when the URB actually is complete.\"\n" "\n" - "I really hope this patch addresses all of Alan's comments and fixes the=\n" - "=20\n" + "I really hope this patch addresses all of Alan's comments and fixes the \n" "\"use-after-freed\" hang, when SLUB debug's poisoning option is enabled.\n" "---\n" - "> I looked quickly at your new code. It seems basically right, but the=\n" - "re\n" - "> are few things that still need attention. For instance, you removed =\n" - "a\n" + "> I looked quickly at your new code. It seems basically right, but there\n" + "> are few things that still need attention. For instance, you removed a\n" "> line to free an URB's transfer buffer.\n" "\n" "yeah, it was there in the last patch, but probably in the wrong place.\n" "Anyway, there's now a small comment so it's easier to spot it.\n" "\n" - "So here's the new \"final\" version, unless someone files a complain with=\n" - "in 24 hours.=20\n" + "So here's the new \"final\" version, unless someone files a complain within 24 hours. \n" "---\n" - "diff -Nurp a/drivers/net/wireless/p54/p54usb.c b/drivers/net/wireless/p=\n" - "54/p54usb.c\n" - "--- a/drivers/net/wireless/p54/p54usb.c\t2008-12-07 21:21:04.017774898 +=\n" - "0100\n" - "+++ b/drivers/net/wireless/p54/p54usb.c\t2008-12-08 14:17:51.863521490 +=\n" - "0100\n" + "diff -Nurp a/drivers/net/wireless/p54/p54usb.c b/drivers/net/wireless/p54/p54usb.c\n" + "--- a/drivers/net/wireless/p54/p54usb.c\t2008-12-07 21:21:04.017774898 +0100\n" + "+++ b/drivers/net/wireless/p54/p54usb.c\t2008-12-08 14:17:51.863521490 +0100\n" "@@ -86,13 +86,13 @@ static void p54u_rx_cb(struct urb *urb)\n" - " \tstruct ieee80211_hw *dev =3D info->dev;\n" - " \tstruct p54u_priv *priv =3D dev->priv;\n" - "=20\n" + " \tstruct ieee80211_hw *dev = info->dev;\n" + " \tstruct p54u_priv *priv = dev->priv;\n" + " \n" "+\tskb_unlink(skb, &priv->rx_queue);\n" "+\n" " \tif (unlikely(urb->status)) {\n" - "-\t\tinfo->urb =3D NULL;\n" + "-\t\tinfo->urb = NULL;\n" "-\t\tusb_free_urb(urb);\n" "+\t\tdev_kfree_skb_irq(skb);\n" " \t\treturn;\n" " \t}\n" - "=20\n" + " \n" "-\tskb_unlink(skb, &priv->rx_queue);\n" " \tskb_put(skb, urb->actual_length);\n" - "=20\n" - " \tif (priv->hw_type =3D=3D P54U_NET2280)\n" + " \n" + " \tif (priv->hw_type == P54U_NET2280)\n" "@@ -105,7 +105,6 @@ static void p54u_rx_cb(struct urb *urb)\n" " \tif (p54_rx(dev, skb)) {\n" - " \t\tskb =3D dev_alloc_skb(priv->common.rx_mtu + 32);\n" + " \t\tskb = dev_alloc_skb(priv->common.rx_mtu + 32);\n" " \t\tif (unlikely(!skb)) {\n" "-\t\t\tusb_free_urb(urb);\n" " \t\t\t/* TODO check rx queue length and refill *somewhere* */\n" " \t\t\treturn;\n" " \t\t}\n" "@@ -115,7 +114,6 @@ static void p54u_rx_cb(struct urb *urb)\n" - " \t\tinfo->dev =3D dev;\n" - " \t\turb->transfer_buffer =3D skb_tail_pointer(skb);\n" - " \t\turb->context =3D skb;\n" + " \t\tinfo->dev = dev;\n" + " \t\turb->transfer_buffer = skb_tail_pointer(skb);\n" + " \t\turb->context = skb;\n" "-\t\tskb_queue_tail(&priv->rx_queue, skb);\n" " \t} else {\n" - " \t\tif (priv->hw_type =3D=3D P54U_NET2280)\n" + " \t\tif (priv->hw_type == P54U_NET2280)\n" " \t\t\tskb_push(skb, priv->common.tx_hdr_len);\n" "@@ -130,11 +128,14 @@ static void p54u_rx_cb(struct urb *urb)\n" " \t\t\tWARN_ON(1);\n" - " \t\t\turb->transfer_buffer =3D skb_tail_pointer(skb);\n" + " \t\t\turb->transfer_buffer = skb_tail_pointer(skb);\n" " \t\t}\n" "-\n" "-\t\tskb_queue_tail(&priv->rx_queue, skb);\n" @@ -93,11 +83,11 @@ "+\t\tdev_kfree_skb_irq(skb);\n" "+\t}\n" " }\n" - "=20\n" + " \n" " static void p54u_tx_reuse_skb_cb(struct urb *urb)\n" - "@@ -144,18 +145,6 @@ static void p54u_tx_reuse_skb_cb(struct=20\n" + "@@ -144,18 +145,6 @@ static void p54u_tx_reuse_skb_cb(struct \n" " \t\tusb_get_intfdata(usb_ifnum_to_if(urb->dev, 0)))->priv;\n" - "=20\n" + " \n" " \tskb_pull(skb, priv->common.tx_hdr_len);\n" "-\tusb_free_urb(urb);\n" "-}\n" @@ -112,11 +102,11 @@ "-\tkfree(urb->transfer_buffer);\n" "-\tusb_free_urb(urb);\n" " }\n" - "=20\n" + " \n" " static void p54u_tx_free_skb_cb(struct urb *urb)\n" "@@ -165,25 +154,36 @@ static void p54u_tx_free_skb_cb(struct u\n" " \t\tusb_get_intfdata(usb_ifnum_to_if(urb->dev, 0));\n" - "=20\n" + " \n" " \tp54_free_skb(dev, skb);\n" "-\tusb_free_urb(urb);\n" "+}\n" @@ -125,32 +115,32 @@ "+\n" "+static void p54u_free_urbs(struct ieee80211_hw *dev)\n" "+{\n" - "+\tstruct p54u_priv *priv =3D dev->priv;\n" + "+\tstruct p54u_priv *priv = dev->priv;\n" "+\tusb_kill_anchored_urbs(&priv->submitted);\n" " }\n" - "=20\n" + " \n" " static int p54u_init_urbs(struct ieee80211_hw *dev)\n" " {\n" - " \tstruct p54u_priv *priv =3D dev->priv;\n" + " \tstruct p54u_priv *priv = dev->priv;\n" "-\tstruct urb *entry;\n" - "+\tstruct urb *entry =3D NULL;\n" + "+\tstruct urb *entry = NULL;\n" " \tstruct sk_buff *skb;\n" " \tstruct p54u_rx_info *info;\n" - "+\tint ret =3D 0;\n" - "=20\n" + "+\tint ret = 0;\n" + " \n" " \twhile (skb_queue_len(&priv->rx_queue) < 32) {\n" - " \t\tskb =3D __dev_alloc_skb(priv->common.rx_mtu + 32, GFP_KERNEL);\n" + " \t\tskb = __dev_alloc_skb(priv->common.rx_mtu + 32, GFP_KERNEL);\n" "-\t\tif (!skb)\n" "-\t\t\tbreak;\n" "+\t\tif (!skb) {\n" - "+\t\t\tret =3D -ENOMEM;\n" + "+\t\t\tret = -ENOMEM;\n" "+\t\t\tgoto err;\n" "+\t\t}\n" - " \t\tentry =3D usb_alloc_urb(0, GFP_KERNEL);\n" + " \t\tentry = usb_alloc_urb(0, GFP_KERNEL);\n" " \t\tif (!entry) {\n" "-\t\t\tkfree_skb(skb);\n" "-\t\t\tbreak;\n" - "+\t\t\tret =3D -ENOMEM;\n" + "+\t\t\tret = -ENOMEM;\n" "+\t\t\tgoto err;\n" " \t\t}\n" "+\n" @@ -158,33 +148,33 @@ " \t\t\t\t usb_rcvbulkpipe(priv->udev, P54U_PIPE_DATA),\n" " \t\t\t\t skb_tail_pointer(skb),\n" "@@ -192,26 +192,25 @@ static int p54u_init_urbs(struct ieee802\n" - " \t\tinfo->urb =3D entry;\n" - " \t\tinfo->dev =3D dev;\n" + " \t\tinfo->urb = entry;\n" + " \t\tinfo->dev = dev;\n" " \t\tskb_queue_tail(&priv->rx_queue, skb);\n" "-\t\tusb_submit_urb(entry, GFP_KERNEL);\n" "+\n" "+\t\tusb_anchor_urb(entry, &priv->submitted);\n" - "+\t\tret =3D usb_submit_urb(entry, GFP_KERNEL);\n" + "+\t\tret = usb_submit_urb(entry, GFP_KERNEL);\n" "+\t\tif (ret) {\n" "+\t\t\tskb_unlink(skb, &priv->rx_queue);\n" "+\t\t\tusb_unanchor_urb(entry);\n" "+\t\t\tgoto err;\n" "+\t\t}\n" "+\t\tusb_free_urb(entry);\n" - "+\t\tentry =3D NULL;\n" + "+\t\tentry = NULL;\n" " \t}\n" - "=20\n" + " \n" " \treturn 0;\n" "-}\n" - "=20\n" + " \n" "-static void p54u_free_urbs(struct ieee80211_hw *dev)\n" "-{\n" - "-\tstruct p54u_priv *priv =3D dev->priv;\n" + "-\tstruct p54u_priv *priv = dev->priv;\n" "-\tstruct p54u_rx_info *info;\n" "-\tstruct sk_buff *skb;\n" "-\n" - "-\twhile ((skb =3D skb_dequeue(&priv->rx_queue))) {\n" - "-\t\tinfo =3D (struct p54u_rx_info *) skb->cb;\n" + "-\twhile ((skb = skb_dequeue(&priv->rx_queue))) {\n" + "-\t\tinfo = (struct p54u_rx_info *) skb->cb;\n" "-\t\tif (!info->urb)\n" "-\t\t\tcontinue;\n" "-\n" @@ -197,16 +187,15 @@ "+\tp54u_free_urbs(dev);\n" "+\treturn ret;\n" " }\n" - "=20\n" - " static void p54u_tx_3887(struct ieee80211_hw *dev, struct sk_buff *skb=\n" - ",\n" + " \n" + " static void p54u_tx_3887(struct ieee80211_hw *dev, struct sk_buff *skb,\n" "@@ -219,6 +218,7 @@ static void p54u_tx_3887(struct ieee8021\n" " {\n" - " \tstruct p54u_priv *priv =3D dev->priv;\n" + " \tstruct p54u_priv *priv = dev->priv;\n" " \tstruct urb *addr_urb, *data_urb;\n" - "+\tint err =3D 0;\n" - "=20\n" - " \taddr_urb =3D usb_alloc_urb(0, GFP_ATOMIC);\n" + "+\tint err = 0;\n" + " \n" + " \taddr_urb = usb_alloc_urb(0, GFP_ATOMIC);\n" " \tif (!addr_urb)\n" "@@ -233,15 +233,31 @@ static void p54u_tx_3887(struct ieee8021\n" " \tusb_fill_bulk_urb(addr_urb, priv->udev,\n" @@ -219,18 +208,18 @@ " \t\t\t skb->data, skb->len,\n" " \t\t\t free_on_tx ? p54u_tx_free_skb_cb :\n" " \t\t\t\t p54u_tx_reuse_skb_cb, skb);\n" - "=20\n" + " \n" "-\tusb_submit_urb(addr_urb, GFP_ATOMIC);\n" "-\tusb_submit_urb(data_urb, GFP_ATOMIC);\n" "+\tusb_anchor_urb(addr_urb, &priv->submitted);\n" - "+\terr =3D usb_submit_urb(addr_urb, GFP_ATOMIC);\n" + "+\terr = usb_submit_urb(addr_urb, GFP_ATOMIC);\n" "+\tif (err) {\n" "+\t\tusb_unanchor_urb(addr_urb);\n" "+\t\tgoto out;\n" "+\t}\n" "+\n" "+\tusb_anchor_urb(addr_urb, &priv->submitted);\n" - "+\terr =3D usb_submit_urb(data_urb, GFP_ATOMIC);\n" + "+\terr = usb_submit_urb(data_urb, GFP_ATOMIC);\n" "+\tif (err)\n" "+\t\tusb_unanchor_urb(data_urb);\n" "+\n" @@ -241,12 +230,12 @@ "+\tif (err)\n" "+\t\tp54_free_skb(dev, skb);\n" " }\n" - "=20\n" + " \n" " static __le32 p54u_lm87_chksum(const __le32 *data, size_t length)\n" "@@ -281,7 +297,13 @@ static void p54u_tx_lm87(struct ieee8021\n" " \t\t\t free_on_tx ? p54u_tx_free_skb_cb :\n" " \t\t\t\t p54u_tx_reuse_skb_cb, skb);\n" - "=20\n" + " \n" "-\tusb_submit_urb(data_urb, GFP_ATOMIC);\n" "+\tusb_anchor_urb(data_urb, &priv->submitted);\n" "+\tif (usb_submit_urb(data_urb, GFP_ATOMIC)) {\n" @@ -256,19 +245,18 @@ "+\t}\n" "+\tusb_free_urb(data_urb);\n" " }\n" - "=20\n" - " static void p54u_tx_net2280(struct ieee80211_hw *dev, struct sk_buff *=\n" - "skb,\n" + " \n" + " static void p54u_tx_net2280(struct ieee80211_hw *dev, struct sk_buff *skb,\n" "@@ -291,6 +313,7 @@ static void p54u_tx_net2280(struct ieee8\n" " \tstruct urb *int_urb, *data_urb;\n" " \tstruct net2280_tx_hdr *hdr;\n" " \tstruct net2280_reg_write *reg;\n" - "+\tint err =3D 0;\n" - "=20\n" - " \treg =3D kmalloc(sizeof(*reg), GFP_ATOMIC);\n" + "+\tint err = 0;\n" + " \n" + " \treg = kmalloc(sizeof(*reg), GFP_ATOMIC);\n" " \tif (!reg)\n" "@@ -320,15 +343,42 @@ static void p54u_tx_net2280(struct ieee8\n" - "=20\n" + " \n" " \tusb_fill_bulk_urb(int_urb, priv->udev,\n" " \t\tusb_sndbulkpipe(priv->udev, P54U_PIPE_DEV), reg, sizeof(*reg),\n" "-\t\tp54u_tx_free_cb, dev);\n" @@ -280,8 +268,8 @@ "+\t * free what's inside the transfer_buffer after the callback routine\n" "+\t * has completed.\n" "+\t */\n" - "+\tint_urb->transfer_flags |=3D URB_FREE_BUFFER;\n" - "=20\n" + "+\tint_urb->transfer_flags |= URB_FREE_BUFFER;\n" + " \n" " \tusb_fill_bulk_urb(data_urb, priv->udev,\n" " \t\t\t usb_sndbulkpipe(priv->udev, P54U_PIPE_DATA),\n" " \t\t\t skb->data, skb->len,\n" @@ -290,14 +278,14 @@ "-\tusb_submit_urb(data_urb, GFP_ATOMIC);\n" "+\n" "+\tusb_anchor_urb(int_urb, &priv->submitted);\n" - "+\terr =3D usb_submit_urb(int_urb, GFP_ATOMIC);\n" + "+\terr = usb_submit_urb(int_urb, GFP_ATOMIC);\n" "+\tif (err) {\n" "+\t\tusb_unanchor_urb(int_urb);\n" "+\t\tgoto out;\n" "+\t}\n" "+\n" "+\tusb_anchor_urb(data_urb, &priv->submitted);\n" - "+\terr =3D usb_submit_urb(data_urb, GFP_ATOMIC);\n" + "+\terr = usb_submit_urb(data_urb, GFP_ATOMIC);\n" "+\tif (err) {\n" "+\t\tusb_unanchor_urb(data_urb);\n" "+\t\tgoto out;\n" @@ -311,34 +299,26 @@ "+\t\tp54_free_skb(dev, skb);\n" "+\t}\n" " }\n" - "=20\n" + " \n" " static int p54u_write(struct p54u_priv *priv,\n" "@@ -886,6 +936,7 @@ static int __devinit p54u_probe(struct u\n" " \t\tgoto err_free_dev;\n" - "=20\n" + " \n" " \tskb_queue_head_init(&priv->rx_queue);\n" "+\tinit_usb_anchor(&priv->submitted);\n" - "=20\n" + " \n" " \tp54u_open(dev);\n" - " \terr =3D p54_read_eeprom(dev);\n" - "diff -Nurp a/drivers/net/wireless/p54/p54usb.h b/drivers/net/wireless/p=\n" - "54/p54usb.h\n" - "--- a/drivers/net/wireless/p54/p54usb.h\t2008-12-07 21:21:04.017774898 +=\n" - "0100\n" - "+++ b/drivers/net/wireless/p54/p54usb.h\t2008-12-07 22:04:45.956897502 +=\n" - "0100\n" + " \terr = p54_read_eeprom(dev);\n" + "diff -Nurp a/drivers/net/wireless/p54/p54usb.h b/drivers/net/wireless/p54/p54usb.h\n" + "--- a/drivers/net/wireless/p54/p54usb.h\t2008-12-07 21:21:04.017774898 +0100\n" + "+++ b/drivers/net/wireless/p54/p54usb.h\t2008-12-07 22:04:45.956897502 +0100\n" "@@ -133,6 +133,7 @@ struct p54u_priv {\n" - "=20\n" + " \n" " \tspinlock_t lock;\n" " \tstruct sk_buff_head rx_queue;\n" "+\tstruct usb_anchor submitted;\n" " };\n" - "=20\n" - " #endif /* P54USB_H */\n" - "--\n" - "To unsubscribe from this list: send the line \"unsubscribe linux-wireles=\n" - "s\" in\n" - "the body of a message to majordomo@vger.kernel.org\n" - More majordomo info at http://vger.kernel.org/majordomo-info.html + " \n" + #endif /* P54USB_H */ -9a148ee5a7f716800cf660bf56da072ef34c1abe0bfe89e2895603691cb1bf26 +7ebe350fbcd995ef0000b6dcd1cdc20da9292a4c9ffc893936648811e66d7fc0
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.