RE: [PATCH] stex: Add reset code for st_yel

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

 




>-----Original Message-----
>From: Jeff Garzik [mailto:jeff@xxxxxxxxxx] 
>Sent: 2009年8月15日 4:10
>To: Ed Lin - PTU
>Cc: James.Bottomley; linux-scsi; Promise_Linux
>Subject: Re: [PATCH] stex: Add reset code for st_yel
>
>
>Ed Lin wrote:
>> Add reset related code for st_yel.
>> 1. Set the SS_H2I_INT_RESET bit.
>> 2. Wait for the SS_MU_OPERATIONAL flag. This is also part of
>>    normal handshake process so move it to handshake routine.
>> 3. Continue handshake with the firmware.
>> 
>> Signed-off-by: Ed Lin <ed.lin@xxxxxxxxxxx>
>> ---
>> 
>> diff --git a/drivers/scsi/stex.c b/drivers/scsi/stex.c
>> index 8d2a95c..b57f92f 100644
>> --- a/drivers/scsi/stex.c
>> +++ b/drivers/scsi/stex.c
>> @@ -55,6 +55,7 @@ enum {
>>  	OIS	= 0x30,	/* MU_OUTBOUND_INTERRUPT_STATUS */
>>  	OIM	= 0x3c,	/* MU_OUTBOUND_INTERRUPT_MASK */
>>  
>> +	YIOA_STATUS				= 0x00,
>>  	YH2I_INT				= 0x20,
>>  	YINT_EN					= 0x34,
>>  	YI2H_INT				= 0x9c,
>> @@ -108,6 +109,10 @@ enum {
>>  
>>  	SS_HEAD_HANDSHAKE			= 0x80,
>>  
>> +	SS_H2I_INT_RESET			= 0x100,
>> +
>> +	SS_MU_OPERATIONAL			= 0x80000000,
>> +
>>  	STEX_CDB_LENGTH				= 16,
>>  	STATUS_VAR_LEN				= 128,
>>  
>> @@ -884,7 +889,7 @@ static void stex_ss_mu_intr(struct st_hba *hba)
>>  		tag = (u16)value;
>>  		if (unlikely(tag >= hba->host->can_queue)) {
>>  			printk(KERN_WARNING DRV_NAME
>> -					"(%s): invalid tag\n", 
>pci_name(hba->pdev));
>> +				"(%s): invalid tag\n", 
>pci_name(hba->pdev));
>>  			continue;
>>  		}
>>  
>> @@ -1040,16 +1045,28 @@ static int stex_ss_handshake(struct 
>st_hba *hba)
>>  	void __iomem *base = hba->mmio_base;
>>  	struct st_msg_header *msg_h;
>>  	struct handshake_frame *h;
>> -	__le32 *scratch = hba->scratch;
>> +	__le32 *scratch;
>>  	u32 data;
>>  	unsigned long before;
>>  	int ret = 0;
>>  
>> -	h = (struct handshake_frame *)(hba->alloc_rq(hba));
>> -	msg_h = (struct st_msg_header *)h - 1;
>> +	before = jiffies;
>> +	while ((readl(base + YIOA_STATUS) & SS_MU_OPERATIONAL) == 0) {
>> +		if (time_after(jiffies, before + MU_MAX_DELAY * HZ)) {
>> +			printk(KERN_ERR DRV_NAME
>> +				"(%s): firmware not operational\n",
>> +				pci_name(hba->pdev));
>> +			return -1;
>> +		}
>> +		rmb();
>> +		msleep(1);
>> +	}
>
>hmmmmm.  Is that rmb() really necessary?  It does not appear to be so.
>
>At worst, the rmb should occur immediately after the loop, no?
>
>ACK everything else.
>
>	Jeff
>
>
>

Do you mean rmb() is not needed for readl()? I checked the x86 version
of readl() and it seems to be so. If so I will come up with a new patch
removing this thing.

Thanks,
Ed Lin
--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [SCSI Target Devel]     [Linux SCSI Target Infrastructure]     [Kernel Newbies]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Linux IIO]     [Samba]     [Device Mapper]
  Powered by Linux