diff options
Diffstat (limited to 'drivers/block')
-rw-r--r-- | drivers/block/ub.c | 53 |
1 files changed, 27 insertions, 26 deletions
diff --git a/drivers/block/ub.c b/drivers/block/ub.c index aa0bf7ee008d..dfe3581b482a 100644 --- a/drivers/block/ub.c +++ b/drivers/block/ub.c | |||
@@ -172,7 +172,7 @@ struct bulk_cs_wrap { | |||
172 | */ | 172 | */ |
173 | struct ub_dev; | 173 | struct ub_dev; |
174 | 174 | ||
175 | #define UB_MAX_REQ_SG 4 | 175 | #define UB_MAX_REQ_SG 9 /* cdrecord requires 32KB and maybe a header */ |
176 | #define UB_MAX_SECTORS 64 | 176 | #define UB_MAX_SECTORS 64 |
177 | 177 | ||
178 | /* | 178 | /* |
@@ -387,7 +387,7 @@ struct ub_dev { | |||
387 | struct bulk_cs_wrap work_bcs; | 387 | struct bulk_cs_wrap work_bcs; |
388 | struct usb_ctrlrequest work_cr; | 388 | struct usb_ctrlrequest work_cr; |
389 | 389 | ||
390 | int sg_stat[UB_MAX_REQ_SG+1]; | 390 | int sg_stat[6]; |
391 | struct ub_scsi_trace tr; | 391 | struct ub_scsi_trace tr; |
392 | }; | 392 | }; |
393 | 393 | ||
@@ -525,12 +525,13 @@ static ssize_t ub_diag_show(struct device *dev, struct device_attribute *attr, | |||
525 | "qlen %d qmax %d\n", | 525 | "qlen %d qmax %d\n", |
526 | sc->cmd_queue.qlen, sc->cmd_queue.qmax); | 526 | sc->cmd_queue.qlen, sc->cmd_queue.qmax); |
527 | cnt += sprintf(page + cnt, | 527 | cnt += sprintf(page + cnt, |
528 | "sg %d %d %d %d %d\n", | 528 | "sg %d %d %d %d %d .. %d\n", |
529 | sc->sg_stat[0], | 529 | sc->sg_stat[0], |
530 | sc->sg_stat[1], | 530 | sc->sg_stat[1], |
531 | sc->sg_stat[2], | 531 | sc->sg_stat[2], |
532 | sc->sg_stat[3], | 532 | sc->sg_stat[3], |
533 | sc->sg_stat[4]); | 533 | sc->sg_stat[4], |
534 | sc->sg_stat[5]); | ||
534 | 535 | ||
535 | list_for_each (p, &sc->luns) { | 536 | list_for_each (p, &sc->luns) { |
536 | lun = list_entry(p, struct ub_lun, link); | 537 | lun = list_entry(p, struct ub_lun, link); |
@@ -835,7 +836,7 @@ static int ub_cmd_build_block(struct ub_dev *sc, struct ub_lun *lun, | |||
835 | return -1; | 836 | return -1; |
836 | } | 837 | } |
837 | cmd->nsg = n_elem; | 838 | cmd->nsg = n_elem; |
838 | sc->sg_stat[n_elem]++; | 839 | sc->sg_stat[n_elem < 5 ? n_elem : 5]++; |
839 | 840 | ||
840 | /* | 841 | /* |
841 | * build the command | 842 | * build the command |
@@ -891,7 +892,7 @@ static int ub_cmd_build_packet(struct ub_dev *sc, struct ub_lun *lun, | |||
891 | return -1; | 892 | return -1; |
892 | } | 893 | } |
893 | cmd->nsg = n_elem; | 894 | cmd->nsg = n_elem; |
894 | sc->sg_stat[n_elem]++; | 895 | sc->sg_stat[n_elem < 5 ? n_elem : 5]++; |
895 | 896 | ||
896 | memcpy(&cmd->cdb, rq->cmd, rq->cmd_len); | 897 | memcpy(&cmd->cdb, rq->cmd, rq->cmd_len); |
897 | cmd->cdb_len = rq->cmd_len; | 898 | cmd->cdb_len = rq->cmd_len; |
@@ -1010,7 +1011,6 @@ static int ub_scsi_cmd_start(struct ub_dev *sc, struct ub_scsi_cmd *cmd) | |||
1010 | sc->last_pipe = sc->send_bulk_pipe; | 1011 | sc->last_pipe = sc->send_bulk_pipe; |
1011 | usb_fill_bulk_urb(&sc->work_urb, sc->dev, sc->send_bulk_pipe, | 1012 | usb_fill_bulk_urb(&sc->work_urb, sc->dev, sc->send_bulk_pipe, |
1012 | bcb, US_BULK_CB_WRAP_LEN, ub_urb_complete, sc); | 1013 | bcb, US_BULK_CB_WRAP_LEN, ub_urb_complete, sc); |
1013 | sc->work_urb.transfer_flags = 0; | ||
1014 | 1014 | ||
1015 | /* Fill what we shouldn't be filling, because usb-storage did so. */ | 1015 | /* Fill what we shouldn't be filling, because usb-storage did so. */ |
1016 | sc->work_urb.actual_length = 0; | 1016 | sc->work_urb.actual_length = 0; |
@@ -1019,7 +1019,6 @@ static int ub_scsi_cmd_start(struct ub_dev *sc, struct ub_scsi_cmd *cmd) | |||
1019 | 1019 | ||
1020 | if ((rc = usb_submit_urb(&sc->work_urb, GFP_ATOMIC)) != 0) { | 1020 | if ((rc = usb_submit_urb(&sc->work_urb, GFP_ATOMIC)) != 0) { |
1021 | /* XXX Clear stalls */ | 1021 | /* XXX Clear stalls */ |
1022 | printk("ub: cmd #%d start failed (%d)\n", cmd->tag, rc); /* P3 */ | ||
1023 | ub_complete(&sc->work_done); | 1022 | ub_complete(&sc->work_done); |
1024 | return rc; | 1023 | return rc; |
1025 | } | 1024 | } |
@@ -1190,11 +1189,9 @@ static void ub_scsi_urb_compl(struct ub_dev *sc, struct ub_scsi_cmd *cmd) | |||
1190 | return; | 1189 | return; |
1191 | } | 1190 | } |
1192 | if (urb->status != 0) { | 1191 | if (urb->status != 0) { |
1193 | printk("ub: cmd #%d cmd status (%d)\n", cmd->tag, urb->status); /* P3 */ | ||
1194 | goto Bad_End; | 1192 | goto Bad_End; |
1195 | } | 1193 | } |
1196 | if (urb->actual_length != US_BULK_CB_WRAP_LEN) { | 1194 | if (urb->actual_length != US_BULK_CB_WRAP_LEN) { |
1197 | printk("ub: cmd #%d xferred %d\n", cmd->tag, urb->actual_length); /* P3 */ | ||
1198 | /* XXX Must do reset here to unconfuse the device */ | 1195 | /* XXX Must do reset here to unconfuse the device */ |
1199 | goto Bad_End; | 1196 | goto Bad_End; |
1200 | } | 1197 | } |
@@ -1395,14 +1392,12 @@ static void ub_data_start(struct ub_dev *sc, struct ub_scsi_cmd *cmd) | |||
1395 | usb_fill_bulk_urb(&sc->work_urb, sc->dev, pipe, | 1392 | usb_fill_bulk_urb(&sc->work_urb, sc->dev, pipe, |
1396 | page_address(sg->page) + sg->offset, sg->length, | 1393 | page_address(sg->page) + sg->offset, sg->length, |
1397 | ub_urb_complete, sc); | 1394 | ub_urb_complete, sc); |
1398 | sc->work_urb.transfer_flags = 0; | ||
1399 | sc->work_urb.actual_length = 0; | 1395 | sc->work_urb.actual_length = 0; |
1400 | sc->work_urb.error_count = 0; | 1396 | sc->work_urb.error_count = 0; |
1401 | sc->work_urb.status = 0; | 1397 | sc->work_urb.status = 0; |
1402 | 1398 | ||
1403 | if ((rc = usb_submit_urb(&sc->work_urb, GFP_ATOMIC)) != 0) { | 1399 | if ((rc = usb_submit_urb(&sc->work_urb, GFP_ATOMIC)) != 0) { |
1404 | /* XXX Clear stalls */ | 1400 | /* XXX Clear stalls */ |
1405 | printk("ub: data #%d submit failed (%d)\n", cmd->tag, rc); /* P3 */ | ||
1406 | ub_complete(&sc->work_done); | 1401 | ub_complete(&sc->work_done); |
1407 | ub_state_done(sc, cmd, rc); | 1402 | ub_state_done(sc, cmd, rc); |
1408 | return; | 1403 | return; |
@@ -1442,7 +1437,6 @@ static int __ub_state_stat(struct ub_dev *sc, struct ub_scsi_cmd *cmd) | |||
1442 | sc->last_pipe = sc->recv_bulk_pipe; | 1437 | sc->last_pipe = sc->recv_bulk_pipe; |
1443 | usb_fill_bulk_urb(&sc->work_urb, sc->dev, sc->recv_bulk_pipe, | 1438 | usb_fill_bulk_urb(&sc->work_urb, sc->dev, sc->recv_bulk_pipe, |
1444 | &sc->work_bcs, US_BULK_CS_WRAP_LEN, ub_urb_complete, sc); | 1439 | &sc->work_bcs, US_BULK_CS_WRAP_LEN, ub_urb_complete, sc); |
1445 | sc->work_urb.transfer_flags = 0; | ||
1446 | sc->work_urb.actual_length = 0; | 1440 | sc->work_urb.actual_length = 0; |
1447 | sc->work_urb.error_count = 0; | 1441 | sc->work_urb.error_count = 0; |
1448 | sc->work_urb.status = 0; | 1442 | sc->work_urb.status = 0; |
@@ -1563,7 +1557,6 @@ static int ub_submit_clear_stall(struct ub_dev *sc, struct ub_scsi_cmd *cmd, | |||
1563 | 1557 | ||
1564 | usb_fill_control_urb(&sc->work_urb, sc->dev, sc->send_ctrl_pipe, | 1558 | usb_fill_control_urb(&sc->work_urb, sc->dev, sc->send_ctrl_pipe, |
1565 | (unsigned char*) cr, NULL, 0, ub_urb_complete, sc); | 1559 | (unsigned char*) cr, NULL, 0, ub_urb_complete, sc); |
1566 | sc->work_urb.transfer_flags = 0; | ||
1567 | sc->work_urb.actual_length = 0; | 1560 | sc->work_urb.actual_length = 0; |
1568 | sc->work_urb.error_count = 0; | 1561 | sc->work_urb.error_count = 0; |
1569 | sc->work_urb.status = 0; | 1562 | sc->work_urb.status = 0; |
@@ -2000,17 +1993,16 @@ static int ub_sync_getmaxlun(struct ub_dev *sc) | |||
2000 | 1993 | ||
2001 | usb_fill_control_urb(&sc->work_urb, sc->dev, sc->recv_ctrl_pipe, | 1994 | usb_fill_control_urb(&sc->work_urb, sc->dev, sc->recv_ctrl_pipe, |
2002 | (unsigned char*) cr, p, 1, ub_probe_urb_complete, &compl); | 1995 | (unsigned char*) cr, p, 1, ub_probe_urb_complete, &compl); |
2003 | sc->work_urb.transfer_flags = 0; | ||
2004 | sc->work_urb.actual_length = 0; | 1996 | sc->work_urb.actual_length = 0; |
2005 | sc->work_urb.error_count = 0; | 1997 | sc->work_urb.error_count = 0; |
2006 | sc->work_urb.status = 0; | 1998 | sc->work_urb.status = 0; |
2007 | 1999 | ||
2008 | if ((rc = usb_submit_urb(&sc->work_urb, GFP_KERNEL)) != 0) { | 2000 | if ((rc = usb_submit_urb(&sc->work_urb, GFP_KERNEL)) != 0) { |
2009 | if (rc == -EPIPE) { | 2001 | if (rc == -EPIPE) { |
2010 | printk("%s: Stall at GetMaxLUN, using 1 LUN\n", | 2002 | printk("%s: Stall submitting GetMaxLUN, using 1 LUN\n", |
2011 | sc->name); /* P3 */ | 2003 | sc->name); /* P3 */ |
2012 | } else { | 2004 | } else { |
2013 | printk(KERN_WARNING | 2005 | printk(KERN_NOTICE |
2014 | "%s: Unable to submit GetMaxLUN (%d)\n", | 2006 | "%s: Unable to submit GetMaxLUN (%d)\n", |
2015 | sc->name, rc); | 2007 | sc->name, rc); |
2016 | } | 2008 | } |
@@ -2028,6 +2020,18 @@ static int ub_sync_getmaxlun(struct ub_dev *sc) | |||
2028 | del_timer_sync(&timer); | 2020 | del_timer_sync(&timer); |
2029 | usb_kill_urb(&sc->work_urb); | 2021 | usb_kill_urb(&sc->work_urb); |
2030 | 2022 | ||
2023 | if ((rc = sc->work_urb.status) < 0) { | ||
2024 | if (rc == -EPIPE) { | ||
2025 | printk("%s: Stall at GetMaxLUN, using 1 LUN\n", | ||
2026 | sc->name); /* P3 */ | ||
2027 | } else { | ||
2028 | printk(KERN_NOTICE | ||
2029 | "%s: Error at GetMaxLUN (%d)\n", | ||
2030 | sc->name, rc); | ||
2031 | } | ||
2032 | goto err_io; | ||
2033 | } | ||
2034 | |||
2031 | if (sc->work_urb.actual_length != 1) { | 2035 | if (sc->work_urb.actual_length != 1) { |
2032 | printk("%s: GetMaxLUN returned %d bytes\n", sc->name, | 2036 | printk("%s: GetMaxLUN returned %d bytes\n", sc->name, |
2033 | sc->work_urb.actual_length); /* P3 */ | 2037 | sc->work_urb.actual_length); /* P3 */ |
@@ -2048,6 +2052,7 @@ static int ub_sync_getmaxlun(struct ub_dev *sc) | |||
2048 | kfree(p); | 2052 | kfree(p); |
2049 | return nluns; | 2053 | return nluns; |
2050 | 2054 | ||
2055 | err_io: | ||
2051 | err_submit: | 2056 | err_submit: |
2052 | kfree(p); | 2057 | kfree(p); |
2053 | err_alloc: | 2058 | err_alloc: |
@@ -2080,7 +2085,6 @@ static int ub_probe_clear_stall(struct ub_dev *sc, int stalled_pipe) | |||
2080 | 2085 | ||
2081 | usb_fill_control_urb(&sc->work_urb, sc->dev, sc->send_ctrl_pipe, | 2086 | usb_fill_control_urb(&sc->work_urb, sc->dev, sc->send_ctrl_pipe, |
2082 | (unsigned char*) cr, NULL, 0, ub_probe_urb_complete, &compl); | 2087 | (unsigned char*) cr, NULL, 0, ub_probe_urb_complete, &compl); |
2083 | sc->work_urb.transfer_flags = 0; | ||
2084 | sc->work_urb.actual_length = 0; | 2088 | sc->work_urb.actual_length = 0; |
2085 | sc->work_urb.error_count = 0; | 2089 | sc->work_urb.error_count = 0; |
2086 | sc->work_urb.status = 0; | 2090 | sc->work_urb.status = 0; |
@@ -2241,10 +2245,10 @@ static int ub_probe(struct usb_interface *intf, | |||
2241 | for (i = 0; i < 3; i++) { | 2245 | for (i = 0; i < 3; i++) { |
2242 | if ((rc = ub_sync_getmaxlun(sc)) < 0) { | 2246 | if ((rc = ub_sync_getmaxlun(sc)) < 0) { |
2243 | /* | 2247 | /* |
2244 | * Some devices (i.e. Iomega Zip100) need this -- | 2248 | * This segment is taken from usb-storage. They say |
2245 | * apparently the bulk pipes get STALLed when the | 2249 | * that ZIP-100 needs this, but my own ZIP-100 works |
2246 | * GetMaxLUN request is processed. | 2250 | * fine without this. |
2247 | * XXX I have a ZIP-100, verify it does this. | 2251 | * Still, it does not seem to hurt anything. |
2248 | */ | 2252 | */ |
2249 | if (rc == -EPIPE) { | 2253 | if (rc == -EPIPE) { |
2250 | ub_probe_clear_stall(sc, sc->recv_bulk_pipe); | 2254 | ub_probe_clear_stall(sc, sc->recv_bulk_pipe); |
@@ -2313,7 +2317,7 @@ static int ub_probe_lun(struct ub_dev *sc, int lnum) | |||
2313 | disk->first_minor = lun->id * UB_MINORS_PER_MAJOR; | 2317 | disk->first_minor = lun->id * UB_MINORS_PER_MAJOR; |
2314 | disk->fops = &ub_bd_fops; | 2318 | disk->fops = &ub_bd_fops; |
2315 | disk->private_data = lun; | 2319 | disk->private_data = lun; |
2316 | disk->driverfs_dev = &sc->intf->dev; /* XXX Many to one ok? */ | 2320 | disk->driverfs_dev = &sc->intf->dev; |
2317 | 2321 | ||
2318 | rc = -ENOMEM; | 2322 | rc = -ENOMEM; |
2319 | if ((q = blk_init_queue(ub_request_fn, &sc->lock)) == NULL) | 2323 | if ((q = blk_init_queue(ub_request_fn, &sc->lock)) == NULL) |
@@ -2466,9 +2470,6 @@ static int __init ub_init(void) | |||
2466 | { | 2470 | { |
2467 | int rc; | 2471 | int rc; |
2468 | 2472 | ||
2469 | /* P3 */ printk("ub: sizeof ub_scsi_cmd %zu ub_dev %zu ub_lun %zu\n", | ||
2470 | sizeof(struct ub_scsi_cmd), sizeof(struct ub_dev), sizeof(struct ub_lun)); | ||
2471 | |||
2472 | if ((rc = register_blkdev(UB_MAJOR, DRV_NAME)) != 0) | 2473 | if ((rc = register_blkdev(UB_MAJOR, DRV_NAME)) != 0) |
2473 | goto err_regblkdev; | 2474 | goto err_regblkdev; |
2474 | devfs_mk_dir(DEVFS_NAME); | 2475 | devfs_mk_dir(DEVFS_NAME); |