Bluetooth: Add fine grained mem_flags usage to btusb driver

The URB submission routines need more fine grained control for the
mem_flags used by kmalloc(), usb_alloc_urb() and usb_submit_urb() to
better support different caller situations. Add a mem_flags parameter
and give the caller full control.

Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
This commit is contained in:
Marcel Holtmann 2008-11-30 12:17:10 +01:00
parent 25f13048bc
commit 2eda66f4a0
1 changed files with 17 additions and 17 deletions

View File

@ -236,7 +236,7 @@ static void btusb_intr_complete(struct urb *urb)
} }
} }
static int btusb_submit_intr_urb(struct hci_dev *hdev) static int btusb_submit_intr_urb(struct hci_dev *hdev, gfp_t mem_flags)
{ {
struct btusb_data *data = hdev->driver_data; struct btusb_data *data = hdev->driver_data;
struct urb *urb; struct urb *urb;
@ -249,13 +249,13 @@ static int btusb_submit_intr_urb(struct hci_dev *hdev)
if (!data->intr_ep) if (!data->intr_ep)
return -ENODEV; return -ENODEV;
urb = usb_alloc_urb(0, GFP_ATOMIC); urb = usb_alloc_urb(0, mem_flags);
if (!urb) if (!urb)
return -ENOMEM; return -ENOMEM;
size = le16_to_cpu(data->intr_ep->wMaxPacketSize); size = le16_to_cpu(data->intr_ep->wMaxPacketSize);
buf = kmalloc(size, GFP_ATOMIC); buf = kmalloc(size, mem_flags);
if (!buf) { if (!buf) {
usb_free_urb(urb); usb_free_urb(urb);
return -ENOMEM; return -ENOMEM;
@ -271,7 +271,7 @@ static int btusb_submit_intr_urb(struct hci_dev *hdev)
usb_anchor_urb(urb, &data->intr_anchor); usb_anchor_urb(urb, &data->intr_anchor);
err = usb_submit_urb(urb, GFP_ATOMIC); err = usb_submit_urb(urb, mem_flags);
if (err < 0) { if (err < 0) {
BT_ERR("%s urb %p submission failed (%d)", BT_ERR("%s urb %p submission failed (%d)",
hdev->name, urb, -err); hdev->name, urb, -err);
@ -319,7 +319,7 @@ static void btusb_bulk_complete(struct urb *urb)
} }
} }
static int btusb_submit_bulk_urb(struct hci_dev *hdev) static int btusb_submit_bulk_urb(struct hci_dev *hdev, gfp_t mem_flags)
{ {
struct btusb_data *data = hdev->driver_data; struct btusb_data *data = hdev->driver_data;
struct urb *urb; struct urb *urb;
@ -332,13 +332,13 @@ static int btusb_submit_bulk_urb(struct hci_dev *hdev)
if (!data->bulk_rx_ep) if (!data->bulk_rx_ep)
return -ENODEV; return -ENODEV;
urb = usb_alloc_urb(0, GFP_KERNEL); urb = usb_alloc_urb(0, mem_flags);
if (!urb) if (!urb)
return -ENOMEM; return -ENOMEM;
size = le16_to_cpu(data->bulk_rx_ep->wMaxPacketSize); size = le16_to_cpu(data->bulk_rx_ep->wMaxPacketSize);
buf = kmalloc(size, GFP_KERNEL); buf = kmalloc(size, mem_flags);
if (!buf) { if (!buf) {
usb_free_urb(urb); usb_free_urb(urb);
return -ENOMEM; return -ENOMEM;
@ -353,7 +353,7 @@ static int btusb_submit_bulk_urb(struct hci_dev *hdev)
usb_anchor_urb(urb, &data->bulk_anchor); usb_anchor_urb(urb, &data->bulk_anchor);
err = usb_submit_urb(urb, GFP_KERNEL); err = usb_submit_urb(urb, mem_flags);
if (err < 0) { if (err < 0) {
BT_ERR("%s urb %p submission failed (%d)", BT_ERR("%s urb %p submission failed (%d)",
hdev->name, urb, -err); hdev->name, urb, -err);
@ -430,7 +430,7 @@ static void inline __fill_isoc_descriptor(struct urb *urb, int len, int mtu)
urb->number_of_packets = i; urb->number_of_packets = i;
} }
static int btusb_submit_isoc_urb(struct hci_dev *hdev) static int btusb_submit_isoc_urb(struct hci_dev *hdev, gfp_t mem_flags)
{ {
struct btusb_data *data = hdev->driver_data; struct btusb_data *data = hdev->driver_data;
struct urb *urb; struct urb *urb;
@ -443,14 +443,14 @@ static int btusb_submit_isoc_urb(struct hci_dev *hdev)
if (!data->isoc_rx_ep) if (!data->isoc_rx_ep)
return -ENODEV; return -ENODEV;
urb = usb_alloc_urb(BTUSB_MAX_ISOC_FRAMES, GFP_KERNEL); urb = usb_alloc_urb(BTUSB_MAX_ISOC_FRAMES, mem_flags);
if (!urb) if (!urb)
return -ENOMEM; return -ENOMEM;
size = le16_to_cpu(data->isoc_rx_ep->wMaxPacketSize) * size = le16_to_cpu(data->isoc_rx_ep->wMaxPacketSize) *
BTUSB_MAX_ISOC_FRAMES; BTUSB_MAX_ISOC_FRAMES;
buf = kmalloc(size, GFP_KERNEL); buf = kmalloc(size, mem_flags);
if (!buf) { if (!buf) {
usb_free_urb(urb); usb_free_urb(urb);
return -ENOMEM; return -ENOMEM;
@ -473,7 +473,7 @@ static int btusb_submit_isoc_urb(struct hci_dev *hdev)
usb_anchor_urb(urb, &data->isoc_anchor); usb_anchor_urb(urb, &data->isoc_anchor);
err = usb_submit_urb(urb, GFP_KERNEL); err = usb_submit_urb(urb, mem_flags);
if (err < 0) { if (err < 0) {
BT_ERR("%s urb %p submission failed (%d)", BT_ERR("%s urb %p submission failed (%d)",
hdev->name, urb, -err); hdev->name, urb, -err);
@ -520,7 +520,7 @@ static int btusb_open(struct hci_dev *hdev)
if (test_and_set_bit(BTUSB_INTR_RUNNING, &data->flags)) if (test_and_set_bit(BTUSB_INTR_RUNNING, &data->flags))
return 0; return 0;
err = btusb_submit_intr_urb(hdev); err = btusb_submit_intr_urb(hdev, GFP_KERNEL);
if (err < 0) { if (err < 0) {
clear_bit(BTUSB_INTR_RUNNING, &data->flags); clear_bit(BTUSB_INTR_RUNNING, &data->flags);
clear_bit(HCI_RUNNING, &hdev->flags); clear_bit(HCI_RUNNING, &hdev->flags);
@ -734,10 +734,10 @@ static void btusb_work(struct work_struct *work)
if (hdev->conn_hash.acl_num > 0) { if (hdev->conn_hash.acl_num > 0) {
if (!test_and_set_bit(BTUSB_BULK_RUNNING, &data->flags)) { if (!test_and_set_bit(BTUSB_BULK_RUNNING, &data->flags)) {
if (btusb_submit_bulk_urb(hdev) < 0) if (btusb_submit_bulk_urb(hdev, GFP_KERNEL) < 0)
clear_bit(BTUSB_BULK_RUNNING, &data->flags); clear_bit(BTUSB_BULK_RUNNING, &data->flags);
else else
btusb_submit_bulk_urb(hdev); btusb_submit_bulk_urb(hdev, GFP_KERNEL);
} }
} else { } else {
clear_bit(BTUSB_BULK_RUNNING, &data->flags); clear_bit(BTUSB_BULK_RUNNING, &data->flags);
@ -754,10 +754,10 @@ static void btusb_work(struct work_struct *work)
} }
if (!test_and_set_bit(BTUSB_ISOC_RUNNING, &data->flags)) { if (!test_and_set_bit(BTUSB_ISOC_RUNNING, &data->flags)) {
if (btusb_submit_isoc_urb(hdev) < 0) if (btusb_submit_isoc_urb(hdev, GFP_KERNEL) < 0)
clear_bit(BTUSB_ISOC_RUNNING, &data->flags); clear_bit(BTUSB_ISOC_RUNNING, &data->flags);
else else
btusb_submit_isoc_urb(hdev); btusb_submit_isoc_urb(hdev, GFP_KERNEL);
} }
} else { } else {
clear_bit(BTUSB_ISOC_RUNNING, &data->flags); clear_bit(BTUSB_ISOC_RUNNING, &data->flags);