diff options
Diffstat (limited to 'drivers/block/ub.c')
-rw-r--r-- | drivers/block/ub.c | 60 |
1 files changed, 12 insertions, 48 deletions
diff --git a/drivers/block/ub.c b/drivers/block/ub.c index cfb824d90c86..60e9a9457c6b 100644 --- a/drivers/block/ub.c +++ b/drivers/block/ub.c | |||
@@ -10,17 +10,13 @@ | |||
10 | * TODO (sorted by decreasing priority) | 10 | * TODO (sorted by decreasing priority) |
11 | * -- set readonly flag for CDs, set removable flag for CF readers | 11 | * -- set readonly flag for CDs, set removable flag for CF readers |
12 | * -- do inquiry and verify we got a disk and not a tape (for LUN mismatch) | 12 | * -- do inquiry and verify we got a disk and not a tape (for LUN mismatch) |
13 | * -- special case some senses, e.g. 3a/0 -> no media present, reduce retries | ||
14 | * -- verify the 13 conditions and do bulk resets | 13 | * -- verify the 13 conditions and do bulk resets |
15 | * -- kill last_pipe and simply do two-state clearing on both pipes | ||
16 | * -- highmem | 14 | * -- highmem |
17 | * -- move top_sense and work_bcs into separate allocations (if they survive) | 15 | * -- move top_sense and work_bcs into separate allocations (if they survive) |
18 | * for cache purists and esoteric architectures. | 16 | * for cache purists and esoteric architectures. |
19 | * -- Allocate structure for LUN 0 before the first ub_sync_tur, avoid NULL. ? | 17 | * -- Allocate structure for LUN 0 before the first ub_sync_tur, avoid NULL. ? |
20 | * -- prune comments, they are too volumnous | 18 | * -- prune comments, they are too volumnous |
21 | * -- Exterminate P3 printks | ||
22 | * -- Resove XXX's | 19 | * -- Resove XXX's |
23 | * -- Redo "benh's retries", perhaps have spin-up code to handle them. V:D=? | ||
24 | * -- CLEAR, CLR2STS, CLRRS seem to be ripe for refactoring. | 20 | * -- CLEAR, CLR2STS, CLRRS seem to be ripe for refactoring. |
25 | */ | 21 | */ |
26 | #include <linux/kernel.h> | 22 | #include <linux/kernel.h> |
@@ -180,7 +176,6 @@ struct ub_dev; | |||
180 | #define UB_DIR_ILLEGAL2 2 | 176 | #define UB_DIR_ILLEGAL2 2 |
181 | #define UB_DIR_WRITE 3 | 177 | #define UB_DIR_WRITE 3 |
182 | 178 | ||
183 | /* P3 */ | ||
184 | #define UB_DIR_CHAR(c) (((c)==UB_DIR_WRITE)? 'w': \ | 179 | #define UB_DIR_CHAR(c) (((c)==UB_DIR_WRITE)? 'w': \ |
185 | (((c)==UB_DIR_READ)? 'r': 'n')) | 180 | (((c)==UB_DIR_READ)? 'r': 'n')) |
186 | 181 | ||
@@ -669,8 +664,9 @@ static int ub_request_fn_1(struct ub_lun *lun, struct request *rq) | |||
669 | */ | 664 | */ |
670 | n_elem = blk_rq_map_sg(lun->disk->queue, rq, &urq->sgv[0]); | 665 | n_elem = blk_rq_map_sg(lun->disk->queue, rq, &urq->sgv[0]); |
671 | if (n_elem < 0) { | 666 | if (n_elem < 0) { |
667 | /* Impossible, because blk_rq_map_sg should not hit ENOMEM. */ | ||
672 | printk(KERN_INFO "%s: failed request map (%d)\n", | 668 | printk(KERN_INFO "%s: failed request map (%d)\n", |
673 | lun->name, n_elem); /* P3 */ | 669 | lun->name, n_elem); |
674 | goto drop; | 670 | goto drop; |
675 | } | 671 | } |
676 | if (n_elem > UB_MAX_REQ_SG) { /* Paranoia */ | 672 | if (n_elem > UB_MAX_REQ_SG) { /* Paranoia */ |
@@ -824,7 +820,9 @@ static int ub_rw_cmd_retry(struct ub_dev *sc, struct ub_lun *lun, | |||
824 | if (urq->current_try >= 3) | 820 | if (urq->current_try >= 3) |
825 | return -EIO; | 821 | return -EIO; |
826 | urq->current_try++; | 822 | urq->current_try++; |
827 | /* P3 */ printk("%s: dir %c len/act %d/%d " | 823 | |
824 | /* Remove this if anyone complains of flooding. */ | ||
825 | printk(KERN_DEBUG "%s: dir %c len/act %d/%d " | ||
828 | "[sense %x %02x %02x] retry %d\n", | 826 | "[sense %x %02x %02x] retry %d\n", |
829 | sc->name, UB_DIR_CHAR(cmd->dir), cmd->len, cmd->act_len, | 827 | sc->name, UB_DIR_CHAR(cmd->dir), cmd->len, cmd->act_len, |
830 | cmd->key, cmd->asc, cmd->ascq, urq->current_try); | 828 | cmd->key, cmd->asc, cmd->ascq, urq->current_try); |
@@ -1241,8 +1239,6 @@ static void ub_scsi_urb_compl(struct ub_dev *sc, struct ub_scsi_cmd *cmd) | |||
1241 | * to check. But it's not all right if the device | 1239 | * to check. But it's not all right if the device |
1242 | * counts disagree with our counts. | 1240 | * counts disagree with our counts. |
1243 | */ | 1241 | */ |
1244 | /* P3 */ printk("%s: resid %d len %d act %d\n", | ||
1245 | sc->name, len, cmd->len, cmd->act_len); | ||
1246 | goto Bad_End; | 1242 | goto Bad_End; |
1247 | } | 1243 | } |
1248 | 1244 | ||
@@ -1253,7 +1249,6 @@ static void ub_scsi_urb_compl(struct ub_dev *sc, struct ub_scsi_cmd *cmd) | |||
1253 | ub_state_sense(sc, cmd); | 1249 | ub_state_sense(sc, cmd); |
1254 | return; | 1250 | return; |
1255 | case US_BULK_STAT_PHASE: | 1251 | case US_BULK_STAT_PHASE: |
1256 | /* P3 */ printk("%s: status PHASE\n", sc->name); | ||
1257 | goto Bad_End; | 1252 | goto Bad_End; |
1258 | default: | 1253 | default: |
1259 | printk(KERN_INFO "%s: unknown CSW status 0x%x\n", | 1254 | printk(KERN_INFO "%s: unknown CSW status 0x%x\n", |
@@ -1568,16 +1563,14 @@ static void ub_reset_task(void *arg) | |||
1568 | } | 1563 | } |
1569 | 1564 | ||
1570 | if (atomic_read(&sc->poison)) { | 1565 | if (atomic_read(&sc->poison)) { |
1571 | printk(KERN_NOTICE "%s: Not resetting disconnected device\n", | 1566 | ; |
1572 | sc->name); /* P3 This floods. Remove soon. XXX */ | ||
1573 | } else if ((sc->reset & 1) == 0) { | 1567 | } else if ((sc->reset & 1) == 0) { |
1574 | ub_sync_reset(sc); | 1568 | ub_sync_reset(sc); |
1575 | msleep(700); /* usb-storage sleeps 6s (!) */ | 1569 | msleep(700); /* usb-storage sleeps 6s (!) */ |
1576 | ub_probe_clear_stall(sc, sc->recv_bulk_pipe); | 1570 | ub_probe_clear_stall(sc, sc->recv_bulk_pipe); |
1577 | ub_probe_clear_stall(sc, sc->send_bulk_pipe); | 1571 | ub_probe_clear_stall(sc, sc->send_bulk_pipe); |
1578 | } else if (sc->dev->actconfig->desc.bNumInterfaces != 1) { | 1572 | } else if (sc->dev->actconfig->desc.bNumInterfaces != 1) { |
1579 | printk(KERN_NOTICE "%s: Not resetting multi-interface device\n", | 1573 | ; |
1580 | sc->name); /* P3 This floods. Remove soon. XXX */ | ||
1581 | } else { | 1574 | } else { |
1582 | if ((lkr = usb_lock_device_for_reset(sc->dev, sc->intf)) < 0) { | 1575 | if ((lkr = usb_lock_device_for_reset(sc->dev, sc->intf)) < 0) { |
1583 | printk(KERN_NOTICE | 1576 | printk(KERN_NOTICE |
@@ -1819,10 +1812,8 @@ static int ub_sync_tur(struct ub_dev *sc, struct ub_lun *lun) | |||
1819 | rc = ub_submit_scsi(sc, cmd); | 1812 | rc = ub_submit_scsi(sc, cmd); |
1820 | spin_unlock_irqrestore(sc->lock, flags); | 1813 | spin_unlock_irqrestore(sc->lock, flags); |
1821 | 1814 | ||
1822 | if (rc != 0) { | 1815 | if (rc != 0) |
1823 | printk("ub: testing ready: submit error (%d)\n", rc); /* P3 */ | ||
1824 | goto err_submit; | 1816 | goto err_submit; |
1825 | } | ||
1826 | 1817 | ||
1827 | wait_for_completion(&compl); | 1818 | wait_for_completion(&compl); |
1828 | 1819 | ||
@@ -1880,20 +1871,16 @@ static int ub_sync_read_cap(struct ub_dev *sc, struct ub_lun *lun, | |||
1880 | rc = ub_submit_scsi(sc, cmd); | 1871 | rc = ub_submit_scsi(sc, cmd); |
1881 | spin_unlock_irqrestore(sc->lock, flags); | 1872 | spin_unlock_irqrestore(sc->lock, flags); |
1882 | 1873 | ||
1883 | if (rc != 0) { | 1874 | if (rc != 0) |
1884 | printk("ub: reading capacity: submit error (%d)\n", rc); /* P3 */ | ||
1885 | goto err_submit; | 1875 | goto err_submit; |
1886 | } | ||
1887 | 1876 | ||
1888 | wait_for_completion(&compl); | 1877 | wait_for_completion(&compl); |
1889 | 1878 | ||
1890 | if (cmd->error != 0) { | 1879 | if (cmd->error != 0) { |
1891 | printk("ub: reading capacity: error %d\n", cmd->error); /* P3 */ | ||
1892 | rc = -EIO; | 1880 | rc = -EIO; |
1893 | goto err_read; | 1881 | goto err_read; |
1894 | } | 1882 | } |
1895 | if (cmd->act_len != 8) { | 1883 | if (cmd->act_len != 8) { |
1896 | printk("ub: reading capacity: size %d\n", cmd->act_len); /* P3 */ | ||
1897 | rc = -EIO; | 1884 | rc = -EIO; |
1898 | goto err_read; | 1885 | goto err_read; |
1899 | } | 1886 | } |
@@ -1907,7 +1894,6 @@ static int ub_sync_read_cap(struct ub_dev *sc, struct ub_lun *lun, | |||
1907 | case 2048: shift = 2; break; | 1894 | case 2048: shift = 2; break; |
1908 | case 4096: shift = 3; break; | 1895 | case 4096: shift = 3; break; |
1909 | default: | 1896 | default: |
1910 | printk("ub: Bad sector size %u\n", bsize); /* P3 */ | ||
1911 | rc = -EDOM; | 1897 | rc = -EDOM; |
1912 | goto err_inv_bsize; | 1898 | goto err_inv_bsize; |
1913 | } | 1899 | } |
@@ -2019,17 +2005,8 @@ static int ub_sync_getmaxlun(struct ub_dev *sc) | |||
2019 | sc->work_urb.error_count = 0; | 2005 | sc->work_urb.error_count = 0; |
2020 | sc->work_urb.status = 0; | 2006 | sc->work_urb.status = 0; |
2021 | 2007 | ||
2022 | if ((rc = usb_submit_urb(&sc->work_urb, GFP_KERNEL)) != 0) { | 2008 | if ((rc = usb_submit_urb(&sc->work_urb, GFP_KERNEL)) != 0) |
2023 | if (rc == -EPIPE) { | ||
2024 | printk("%s: Stall submitting GetMaxLUN, using 1 LUN\n", | ||
2025 | sc->name); /* P3 */ | ||
2026 | } else { | ||
2027 | printk(KERN_NOTICE | ||
2028 | "%s: Unable to submit GetMaxLUN (%d)\n", | ||
2029 | sc->name, rc); | ||
2030 | } | ||
2031 | goto err_submit; | 2009 | goto err_submit; |
2032 | } | ||
2033 | 2010 | ||
2034 | init_timer(&timer); | 2011 | init_timer(&timer); |
2035 | timer.function = ub_probe_timeout; | 2012 | timer.function = ub_probe_timeout; |
@@ -2042,21 +2019,10 @@ static int ub_sync_getmaxlun(struct ub_dev *sc) | |||
2042 | del_timer_sync(&timer); | 2019 | del_timer_sync(&timer); |
2043 | usb_kill_urb(&sc->work_urb); | 2020 | usb_kill_urb(&sc->work_urb); |
2044 | 2021 | ||
2045 | if ((rc = sc->work_urb.status) < 0) { | 2022 | if ((rc = sc->work_urb.status) < 0) |
2046 | if (rc == -EPIPE) { | ||
2047 | printk("%s: Stall at GetMaxLUN, using 1 LUN\n", | ||
2048 | sc->name); /* P3 */ | ||
2049 | } else { | ||
2050 | printk(KERN_NOTICE | ||
2051 | "%s: Error at GetMaxLUN (%d)\n", | ||
2052 | sc->name, rc); | ||
2053 | } | ||
2054 | goto err_io; | 2023 | goto err_io; |
2055 | } | ||
2056 | 2024 | ||
2057 | if (sc->work_urb.actual_length != 1) { | 2025 | if (sc->work_urb.actual_length != 1) { |
2058 | printk("%s: GetMaxLUN returned %d bytes\n", sc->name, | ||
2059 | sc->work_urb.actual_length); /* P3 */ | ||
2060 | nluns = 0; | 2026 | nluns = 0; |
2061 | } else { | 2027 | } else { |
2062 | if ((nluns = *p) == 55) { | 2028 | if ((nluns = *p) == 55) { |
@@ -2067,8 +2033,6 @@ static int ub_sync_getmaxlun(struct ub_dev *sc) | |||
2067 | if (nluns > UB_MAX_LUNS) | 2033 | if (nluns > UB_MAX_LUNS) |
2068 | nluns = UB_MAX_LUNS; | 2034 | nluns = UB_MAX_LUNS; |
2069 | } | 2035 | } |
2070 | printk("%s: GetMaxLUN returned %d, using %d LUNs\n", sc->name, | ||
2071 | *p, nluns); /* P3 */ | ||
2072 | } | 2036 | } |
2073 | 2037 | ||
2074 | kfree(p); | 2038 | kfree(p); |
@@ -2266,7 +2230,7 @@ static int ub_probe(struct usb_interface *intf, | |||
2266 | * has to succeed, so we clear checks with an additional one here. | 2230 | * has to succeed, so we clear checks with an additional one here. |
2267 | * In any case it's not our business how revaliadation is implemented. | 2231 | * In any case it's not our business how revaliadation is implemented. |
2268 | */ | 2232 | */ |
2269 | for (i = 0; i < 3; i++) { /* Retries for benh's key */ | 2233 | for (i = 0; i < 3; i++) { /* Retries for the schwag key from KS'04 */ |
2270 | if ((rc = ub_sync_tur(sc, NULL)) <= 0) break; | 2234 | if ((rc = ub_sync_tur(sc, NULL)) <= 0) break; |
2271 | if (rc != 0x6) break; | 2235 | if (rc != 0x6) break; |
2272 | msleep(10); | 2236 | msleep(10); |