Skip to content

Commit b212ffa

Browse files
committed
Merge branch 'ISDN-irqsave-and-usb_fill_int_urb'
Sebastian Andrzej Siewior says: ==================== ISDN: use irqsave() in URB completion + usb_fill_int_urb This series is mostly about using _irqsave() primitives in the completion callback in order to get rid of local_irq_save() in __usb_hcd_giveback_urb(). While at it, I also tried to move drivers to use usb_fill_int_urb() otherwise it is hard find users of a certain API. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
2 parents e8f5b03 + 16630f5 commit b212ffa

File tree

4 files changed

+38
-45
lines changed

4 files changed

+38
-45
lines changed

drivers/isdn/gigaset/bas-gigaset.c

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -972,16 +972,14 @@ static int starturbs(struct bc_state *bcs)
972972
rc = -EFAULT;
973973
goto error;
974974
}
975+
usb_fill_int_urb(urb, bcs->cs->hw.bas->udev,
976+
usb_rcvisocpipe(urb->dev, 3 + 2 * bcs->channel),
977+
ubc->isoinbuf + k * BAS_INBUFSIZE,
978+
BAS_INBUFSIZE, read_iso_callback, bcs,
979+
BAS_FRAMETIME);
975980

976-
urb->dev = bcs->cs->hw.bas->udev;
977-
urb->pipe = usb_rcvisocpipe(urb->dev, 3 + 2 * bcs->channel);
978981
urb->transfer_flags = URB_ISO_ASAP;
979-
urb->transfer_buffer = ubc->isoinbuf + k * BAS_INBUFSIZE;
980-
urb->transfer_buffer_length = BAS_INBUFSIZE;
981982
urb->number_of_packets = BAS_NUMFRAMES;
982-
urb->interval = BAS_FRAMETIME;
983-
urb->complete = read_iso_callback;
984-
urb->context = bcs;
985983
for (j = 0; j < BAS_NUMFRAMES; j++) {
986984
urb->iso_frame_desc[j].offset = j * BAS_MAXFRAME;
987985
urb->iso_frame_desc[j].length = BAS_MAXFRAME;
@@ -1005,15 +1003,15 @@ static int starturbs(struct bc_state *bcs)
10051003
rc = -EFAULT;
10061004
goto error;
10071005
}
1008-
urb->dev = bcs->cs->hw.bas->udev;
1009-
urb->pipe = usb_sndisocpipe(urb->dev, 4 + 2 * bcs->channel);
1006+
usb_fill_int_urb(urb, bcs->cs->hw.bas->udev,
1007+
usb_sndisocpipe(urb->dev, 4 + 2 * bcs->channel),
1008+
ubc->isooutbuf->data,
1009+
sizeof(ubc->isooutbuf->data),
1010+
write_iso_callback, &ubc->isoouturbs[k],
1011+
BAS_FRAMETIME);
1012+
10101013
urb->transfer_flags = URB_ISO_ASAP;
1011-
urb->transfer_buffer = ubc->isooutbuf->data;
1012-
urb->transfer_buffer_length = sizeof(ubc->isooutbuf->data);
10131014
urb->number_of_packets = BAS_NUMFRAMES;
1014-
urb->interval = BAS_FRAMETIME;
1015-
urb->complete = write_iso_callback;
1016-
urb->context = &ubc->isoouturbs[k];
10171015
for (j = 0; j < BAS_NUMFRAMES; ++j) {
10181016
urb->iso_frame_desc[j].offset = BAS_OUTBUFSIZE;
10191017
urb->iso_frame_desc[j].length = BAS_NORMFRAME;

drivers/isdn/hardware/mISDN/hfcsusb.c

Lines changed: 20 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -819,6 +819,7 @@ hfcsusb_rx_frame(struct usb_fifo *fifo, __u8 *data, unsigned int len,
819819
int fifon = fifo->fifonum;
820820
int i;
821821
int hdlc = 0;
822+
unsigned long flags;
822823

823824
if (debug & DBG_HFC_CALL_TRACE)
824825
printk(KERN_DEBUG "%s: %s: fifo(%i) len(%i) "
@@ -835,7 +836,7 @@ hfcsusb_rx_frame(struct usb_fifo *fifo, __u8 *data, unsigned int len,
835836
return;
836837
}
837838

838-
spin_lock(&hw->lock);
839+
spin_lock_irqsave(&hw->lock, flags);
839840
if (fifo->dch) {
840841
rx_skb = fifo->dch->rx_skb;
841842
maxlen = fifo->dch->maxlen;
@@ -844,7 +845,7 @@ hfcsusb_rx_frame(struct usb_fifo *fifo, __u8 *data, unsigned int len,
844845
if (fifo->bch) {
845846
if (test_bit(FLG_RX_OFF, &fifo->bch->Flags)) {
846847
fifo->bch->dropcnt += len;
847-
spin_unlock(&hw->lock);
848+
spin_unlock_irqrestore(&hw->lock, flags);
848849
return;
849850
}
850851
maxlen = bchannel_get_rxbuf(fifo->bch, len);
@@ -854,7 +855,7 @@ hfcsusb_rx_frame(struct usb_fifo *fifo, __u8 *data, unsigned int len,
854855
skb_trim(rx_skb, 0);
855856
pr_warning("%s.B%d: No bufferspace for %d bytes\n",
856857
hw->name, fifo->bch->nr, len);
857-
spin_unlock(&hw->lock);
858+
spin_unlock_irqrestore(&hw->lock, flags);
858859
return;
859860
}
860861
maxlen = fifo->bch->maxlen;
@@ -878,7 +879,7 @@ hfcsusb_rx_frame(struct usb_fifo *fifo, __u8 *data, unsigned int len,
878879
} else {
879880
printk(KERN_DEBUG "%s: %s: No mem for rx_skb\n",
880881
hw->name, __func__);
881-
spin_unlock(&hw->lock);
882+
spin_unlock_irqrestore(&hw->lock, flags);
882883
return;
883884
}
884885
}
@@ -888,7 +889,7 @@ hfcsusb_rx_frame(struct usb_fifo *fifo, __u8 *data, unsigned int len,
888889
"for fifo(%d) HFCUSB_D_RX\n",
889890
hw->name, __func__, fifon);
890891
skb_trim(rx_skb, 0);
891-
spin_unlock(&hw->lock);
892+
spin_unlock_irqrestore(&hw->lock, flags);
892893
return;
893894
}
894895
}
@@ -942,7 +943,7 @@ hfcsusb_rx_frame(struct usb_fifo *fifo, __u8 *data, unsigned int len,
942943
/* deliver transparent data to layer2 */
943944
recv_Bchannel(fifo->bch, MISDN_ID_ANY, false);
944945
}
945-
spin_unlock(&hw->lock);
946+
spin_unlock_irqrestore(&hw->lock, flags);
946947
}
947948

948949
static void
@@ -979,18 +980,19 @@ rx_iso_complete(struct urb *urb)
979980
__u8 *buf;
980981
static __u8 eof[8];
981982
__u8 s0_state;
983+
unsigned long flags;
982984

983985
fifon = fifo->fifonum;
984986
status = urb->status;
985987

986-
spin_lock(&hw->lock);
988+
spin_lock_irqsave(&hw->lock, flags);
987989
if (fifo->stop_gracefull) {
988990
fifo->stop_gracefull = 0;
989991
fifo->active = 0;
990-
spin_unlock(&hw->lock);
992+
spin_unlock_irqrestore(&hw->lock, flags);
991993
return;
992994
}
993-
spin_unlock(&hw->lock);
995+
spin_unlock_irqrestore(&hw->lock, flags);
994996

995997
/*
996998
* ISO transfer only partially completed,
@@ -1096,15 +1098,16 @@ rx_int_complete(struct urb *urb)
10961098
struct usb_fifo *fifo = (struct usb_fifo *) urb->context;
10971099
struct hfcsusb *hw = fifo->hw;
10981100
static __u8 eof[8];
1101+
unsigned long flags;
10991102

1100-
spin_lock(&hw->lock);
1103+
spin_lock_irqsave(&hw->lock, flags);
11011104
if (fifo->stop_gracefull) {
11021105
fifo->stop_gracefull = 0;
11031106
fifo->active = 0;
1104-
spin_unlock(&hw->lock);
1107+
spin_unlock_irqrestore(&hw->lock, flags);
11051108
return;
11061109
}
1107-
spin_unlock(&hw->lock);
1110+
spin_unlock_irqrestore(&hw->lock, flags);
11081111

11091112
fifon = fifo->fifonum;
11101113
if ((!fifo->active) || (urb->status)) {
@@ -1172,12 +1175,13 @@ tx_iso_complete(struct urb *urb)
11721175
int *tx_idx;
11731176
int frame_complete, fifon, status, fillempty = 0;
11741177
__u8 threshbit, *p;
1178+
unsigned long flags;
11751179

1176-
spin_lock(&hw->lock);
1180+
spin_lock_irqsave(&hw->lock, flags);
11771181
if (fifo->stop_gracefull) {
11781182
fifo->stop_gracefull = 0;
11791183
fifo->active = 0;
1180-
spin_unlock(&hw->lock);
1184+
spin_unlock_irqrestore(&hw->lock, flags);
11811185
return;
11821186
}
11831187

@@ -1195,7 +1199,7 @@ tx_iso_complete(struct urb *urb)
11951199
} else {
11961200
printk(KERN_DEBUG "%s: %s: neither BCH nor DCH\n",
11971201
hw->name, __func__);
1198-
spin_unlock(&hw->lock);
1202+
spin_unlock_irqrestore(&hw->lock, flags);
11991203
return;
12001204
}
12011205

@@ -1375,7 +1379,7 @@ tx_iso_complete(struct urb *urb)
13751379
hw->name, __func__,
13761380
symbolic(urb_errlist, status), status, fifon);
13771381
}
1378-
spin_unlock(&hw->lock);
1382+
spin_unlock_irqrestore(&hw->lock, flags);
13791383
}
13801384

13811385
/*

drivers/isdn/hisax/hfc_usb.c

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -432,16 +432,12 @@ fill_isoc_urb(struct urb *urb, struct usb_device *dev, unsigned int pipe,
432432
{
433433
int k;
434434

435-
urb->dev = dev;
436-
urb->pipe = pipe;
437-
urb->complete = complete;
435+
usb_fill_int_urb(urb, dev, pipe, buf, packet_size * num_packets,
436+
complete, context, interval);
437+
438438
urb->number_of_packets = num_packets;
439-
urb->transfer_buffer_length = packet_size * num_packets;
440-
urb->context = context;
441-
urb->transfer_buffer = buf;
442439
urb->transfer_flags = URB_ISO_ASAP;
443440
urb->actual_length = 0;
444-
urb->interval = interval;
445441
for (k = 0; k < num_packets; k++) {
446442
urb->iso_frame_desc[k].offset = packet_size * k;
447443
urb->iso_frame_desc[k].length = packet_size;

drivers/isdn/hisax/st5481_usb.c

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -408,15 +408,10 @@ fill_isoc_urb(struct urb *urb, struct usb_device *dev,
408408
{
409409
int k;
410410

411-
urb->dev = dev;
412-
urb->pipe = pipe;
413-
urb->interval = 1;
414-
urb->transfer_buffer = buf;
411+
usb_fill_int_urb(urb, dev, pipe, buf, num_packets * packet_size,
412+
complete, context, 1);
413+
415414
urb->number_of_packets = num_packets;
416-
urb->transfer_buffer_length = num_packets * packet_size;
417-
urb->actual_length = 0;
418-
urb->complete = complete;
419-
urb->context = context;
420415
urb->transfer_flags = URB_ISO_ASAP;
421416
for (k = 0; k < num_packets; k++) {
422417
urb->iso_frame_desc[k].offset = packet_size * k;

0 commit comments

Comments
 (0)