• Finn Thain's avatar
    scsi: esp_scsi: Avoid sending ABORT TASK SET messages · c69edff5
    Finn Thain authored
    If an LLD aborts a task set, it should complete the affected commands
    with the appropriate result code. In a couple of cases esp_scsi doesn't
    do so.
    
    When the initiator receives an unhandled message, just respond by sending
    a MESSAGE REJECT instead of ABORT TASK SET, and thus avoid the issue.
    
    OTOH, a MESSAGE REJECT sent by a target can be taken as an indication
    that the initiator messed up somehow. It isn't always possible to abort
    correctly, so just fall back on a SCSI bus reset, which will complete the
    affected commands with the appropriate result code.
    
    For example, certain Apple (Sony) CD-ROM drives, when the non-existent
    LUN 1 is scanned, can't handle the INQUIRY command. The problem is not
    detected until the initiator gets a MESSAGE REJECT. Whenever esp_scsi
    sees that message, it raises ATN and sends ABORT TASK SET -- but
    neglects to complete the failed scmd.
    
    The target then goes into DATA OUT phase (probably bogus), while the ESP
    device goes into disconnected mode (surprising, given the bus phase).
    The next Transfer Information command from esp_scsi then causes
    an Invalid Command interrupt because that command is not valid when in
    disconnected mode:
    
    mac_esp: using PDMA for controller 0
    mac_esp mac_esp.0: esp0: regs[50f10000:(null)] irq[19]
    mac_esp mac_esp.0: esp0: is a ESP236, 16 MHz (ccf=4), SCSI ID 7
    scsi host0: esp
    scsi 0:0:0:0: Direct-Access     SEAGATE  ST318416N        0010 PQ: 0 ANSI: 3
    scsi target0:0:0: Beginning Domain Validation
    scsi target0:0:0: asynchronous
    scsi target0:0:0: Domain Validation skipping write tests
    scsi target0:0:0: Ending Domain Validation
    scsi 0:0:3:0: CD-ROM            SONY     CD-ROM CDU-8003A 1.9a PQ: 0 ANSI: 2 CCS
    scsi target0:0:3: Beginning Domain Validation
    scsi target0:0:3: FAST-5 SCSI 2.0 MB/s ST (500 ns, offset 15)
    scsi target0:0:3: Domain Validation skipping write tests
    scsi target0:0:3: Ending Domain Validation
    scsi host0: unexpected IREG 40
    scsi host0: Dumping command log
    scsi host0: ent[2] CMD val[c2] sreg[90] seqreg[cc] sreg2[00] ireg[20] ss[01] event[0c]
    scsi host0: ent[3] CMD val[00] sreg[91] seqreg[04] sreg2[00] ireg[18] ss[00] event[0c]
    scsi host0: ent[4] EVENT val[0d] sreg[91] seqreg[04] sreg2[00] ireg[18] ss[00] event[0c]
    scsi host0: ent[5] EVENT val[03] sreg[91] seqreg[04] sreg2[00] ireg[18] ss[00] event[0d]
    scsi host0: ent[6] CMD val[90] sreg[91] seqreg[04] sreg2[00] ireg[18] ss[00] event[03]
    scsi host0: ent[7] EVENT val[05] sreg[91] seqreg[04] sreg2[00] ireg[18] ss[00] event[03]
    scsi host0: ent[8] EVENT val[0d] sreg[93] seqreg[cc] sreg2[00] ireg[10] ss[00] event[05]
    scsi host0: ent[9] CMD val[01] sreg[93] seqreg[cc] sreg2[00] ireg[10] ss[00] event[0d]
    scsi host0: ent[10] CMD val[11] sreg[93] seqreg[cc] sreg2[00] ireg[10] ss[00] event[0d]
    scsi host0: ent[11] EVENT val[0b] sreg[93] seqreg[cc] sreg2[00] ireg[10] ss[00] event[0d]
    scsi host0: ent[12] CMD val[12] sreg[97] seqreg[cc] sreg2[00] ireg[08] ss[00] event[0b]
    scsi host0: ent[13] EVENT val[0c] sreg[97] seqreg[cc] sreg2[00] ireg[08] ss[00] event[0b]
    scsi host0: ent[14] CMD val[44] sreg[90] seqreg[cc] sreg2[00] ireg[20] ss[00] event[0c]
    scsi host0: ent[15] CMD val[01] sreg[90] seqreg[cc] sreg2[00] ireg[20] ss[01] event[0c]
    scsi host0: ent[16] CMD val[c2] sreg[90] seqreg[cc] sreg2[00] ireg[20] ss[01] event[0c]
    scsi host0: ent[17] CMD val[00] sreg[87] seqreg[02] sreg2[00] ireg[18] ss[00] event[0c]
    scsi host0: ent[18] EVENT val[0d] sreg[87] seqreg[02] sreg2[00] ireg[18] ss[00] event[0c]
    scsi host0: ent[19] EVENT val[06] sreg[87] seqreg[02] sreg2[00] ireg[18] ss[00] event[0d]
    scsi host0: ent[20] CMD val[01] sreg[87] seqreg[02] sreg2[00] ireg[18] ss[00] event[06]
    scsi host0: ent[21] CMD val[10] sreg[87] seqreg[02] sreg2[00] ireg[18] ss[00] event[06]
    scsi host0: ent[22] CMD val[1a] sreg[87] seqreg[ca] sreg2[00] ireg[08] ss[00] event[06]
    scsi host0: ent[23] CMD val[12] sreg[87] seqreg[ca] sreg2[00] ireg[08] ss[00] event[06]
    scsi host0: ent[24] EVENT val[0d] sreg[87] seqreg[ca] sreg2[00] ireg[08] ss[00] event[06]
    scsi host0: ent[25] EVENT val[09] sreg[86] seqreg[ca] sreg2[00] ireg[10] ss[00] event[0d]
    scsi host0: ent[26] CMD val[01] sreg[86] seqreg[ca] sreg2[00] ireg[10] ss[00] event[09]
    scsi host0: ent[27] CMD val[10] sreg[86] seqreg[ca] sreg2[00] ireg[10] ss[00] event[09]
    scsi host0: ent[28] EVENT val[0a] sreg[86] seqreg[ca] sreg2[00] ireg[10] ss[00] event[09]
    scsi host0: ent[29] EVENT val[0d] sreg[80] seqreg[ca] sreg2[00] ireg[20] ss[00] event[0a]
    scsi host0: ent[30] EVENT val[04] sreg[80] seqreg[ca] sreg2[00] ireg[20] ss[00] event[0d]
    scsi host0: ent[31] CMD val[01] sreg[80] seqreg[ca] sreg2[00] ireg[20] ss[00] event[04]
    scsi host0: ent[0] CMD val[90] sreg[80] seqreg[ca] sreg2[00] ireg[20] ss[00] event[04]
    scsi host0: ent[1] EVENT val[05] sreg[80] seqreg[ca] sreg2[00] ireg[20] ss[00] event[04]
    scsi target0:0:3: FAST-5 SCSI 2.0 MB/s ST (500 ns, offset 15)
    scsi target0:0:0: asynchronous
    sr 0:0:3:0: [sr0] scsi-1 drive
    cdrom: Uniform CD-ROM driver Revision: 3.20
    sd 0:0:0:0: Attached scsi generic sg0 type 0
    sr 0:0:3:0: Attached scsi generic sg1 type 5
    
    This patch resolves this issue because the bus reset causes the INQUIRY
    command to fail earlier, and return the appropriate result code.
    Tested-by: default avatarStan Johnson <userm57@yahoo.com>
    Signed-off-by: default avatarFinn Thain <fthain@telegraphics.com.au>
    Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
    c69edff5
esp_scsi.c 66.6 KB