qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH 3/4] LSI53C895A: Implement TARGET RESET message


From: Ryan Harper
Subject: Re: [Qemu-devel] [PATCH 3/4] LSI53C895A: Implement TARGET RESET message
Date: Mon, 8 Dec 2008 12:58:27 -0600
User-agent: Mutt/1.5.6+20040907i

* Paul Brook <address@hidden> [2008-12-08 12:39]:
> On Monday 08 December 2008, Ryan Harper wrote:
> > Linux and Windows send a TARGET RESET message to the device when it fails
> > to respond as it expects.  For example, when it tries to select LUN1, which
> > we don't support.  This patch is needed to support the Linux sym53c8xx_2
> > driver when configured with SYM_CONF_DMA_ADDRESSING_MODE=2
> >
> > Signed-off-by: Ryan Harper <address@hidden>
> >
> > diff --git a/hw/lsi53c895a.c b/hw/lsi53c895a.c
> > index b36c08c..ac8c5a5 100644
> > --- a/hw/lsi53c895a.c
> > +++ b/hw/lsi53c895a.c
> > @@ -804,6 +804,10 @@ static void lsi_do_msgout(LSIState *s)
> >                  goto bad;
> >              }
> >              break;
> > +        case 0x0c: /* TARGET RESET */
> > +            DPRINTF("MSG: Target Reset\n");
> > +            lsi_soft_reset(s);
> > +            break;
> >          case 0x20: /* SIMPLE queue */
> >              s->current_tag |= lsi_get_msgbyte(s) | LSI_TAG_VALID;
> >              DPRINTF("SIMPLE queue tag=0x%x\n", s->current_tag & 0xff);
> 
> This looks wrong. The clue is in the name. This should reset the *target* 
> device (i.e. the disk) not the host adapter.
> 
> Probably also explains why you need the bogus 4th patch.

The target reset can go away, but we still need the 4th patch.  The
linux driver does bus resets after failing to probe LUNs we don't
support.  I first noticed that we fail with a Reselect with pending DMA:

[   49.438690] sd 2:0:0:0: Attached scsi generic sg1 type 0
[   49.444504] sym0: SCSI BUS reset detected.
[   49.459818] sym0: SCSI BUS has been reset.
[   52.850722] sym0: SCSI BUS reset detected.
[   52.866301] sym0: SCSI BUS has been reset.
[   56.358587] sym0: SCSI BUS reset detected.
[   56.374131] sym0: SCSI BUS has been reset.
[   59.858698] sym0: SCSI BUS reset detected.
[   59.875703] sym0: SCSI BUS has been reset.
[   63.362570] sym0: SCSI BUS reset detected.
lsi_scsi: error: Reselect with pending DMA
[   63.378562] sym0: SCSI BUS has been reset.
[   63.381405] BUG: unable to handle kernel NULL pointer dereference at
0000000000000358
[   63.385283] IP: [<ffffffffa007d894>] sym_int_sir+0x679/0x1500
[sym53c8xx]

Which I figured was because lsi_soft_reset doesn't initialize
current_dma_len.  I added current_dma_len to soft_reset and now we can
probe with out failing, and existing partitions on the device show up,
but any further use of the device results in broken behavior. 

address@hidden:~# cat /proc/partitions
major minor  #blocks  name

 254        0   10485760 vda
 254        1    9992398 vda1
 254        2          1 vda2
 254        5     489951 vda5
   8        0   52449280 sda
   8        1   10241406 sda1
address@hidden:~# fdisk -l /dev/sda

Disk /dev/sda: 53.7 GB, 53708062720 bytes
64 heads, 32 sectors/track, 51220 cylinders
Units = cylinders of 2048 * 512 = 1048576 bytes
Disk identifier: 0x00000000

Disk /dev/sda doesn't contain a valid partition table


Because the driver is issueing bus resets, we're clobbering the scratch
registers.

So, to summarize, I'll drop the TARGET RESET patch since it is
completely wrong, but we still need the quirk patch.

-- 
Ryan Harper
Software Engineer; Linux Technology Center
IBM Corp., Austin, Tx
address@hidden




reply via email to

[Prev in Thread] Current Thread [Next in Thread]