Subject: Re: [PATCH 6/8] csiostor: Chelsio FCoE offload driver submission (headers part 1).

From: Naresh Kumar Inna <[email-masked]>
Date: Sat, 25 Aug 2012 23:39:08 +0530

On 8/25/2012 2:47 AM, Nicholas A. Bellinger wrote:
> On Sat, 2012-08-25 at 00:06 +0530, Naresh Kumar Inna wrote:
>> On 8/24/2012 1:28 AM, Nicholas A. Bellinger wrote:
>>> On Fri, 2012-08-24 at 03:57 +0530, Naresh Kumar Inna wrote:
>>>> This patch contains the first set of the header files for csiostor driver.
>>>>
>>>> Signed-off-by: Naresh Kumar Inna <[email-masked]>
>>>> ---
>>>>  drivers/scsi/csiostor/csio_defs.h       |  143 ++++++
>>>>  drivers/scsi/csiostor/csio_fcoe_proto.h |  843 +++++++++++++++++++++++++++++++
>>>>  drivers/scsi/csiostor/csio_hw.h         |  668 ++++++++++++++++++++++++
>>>>  drivers/scsi/csiostor/csio_init.h       |  158 ++++++
>>>>  4 files changed, 1812 insertions(+), 0 deletions(-)
>>>>  create mode 100644 drivers/scsi/csiostor/csio_defs.h
>>>>  create mode 100644 drivers/scsi/csiostor/csio_fcoe_proto.h
>>>>  create mode 100644 drivers/scsi/csiostor/csio_hw.h
>>>>  create mode 100644 drivers/scsi/csiostor/csio_init.h
>>>>
>>>
>>> Hi Naresh,
>>>
>>> Just commenting on csio_defs.h bits here...  As Robert mentioned, you'll
>>> need to convert the driver to use (or add to) upstream protocol
>>> definitions and drop the csio_fcoe_proto.h bits..
>>>
>>
>> Hi Nicholas,
>>
>> I would like take up the discussion of the protocol header file in that
>> email thread. Please find the rest of my replies inline.
>>
>> Thanks for reviewing,
>> Naresh.
>>
>>>> diff --git a/drivers/scsi/csiostor/csio_defs.h b/drivers/scsi/csiostor/csio_defs.h
>>>> new file mode 100644
>>>> index 0000000..4f1c713
>>>> --- /dev/null
>>>> +++ b/drivers/scsi/csiostor/csio_defs.h
> 
> <SNIP>
> 
>>>> +#ifndef __CSIO_DEFS_H__
>>>> +#define __CSIO_DEFS_H__
>>>> +
>>>> +#include <linux/kernel.h>
>>>> +#include <linux/timer.h>
>>>> +#include <linux/list.h>
>>>> +#include <linux/bug.h>
>>>> +#include <linux/pci.h>
>>>> +#include <linux/jiffies.h>
>>>> +
>>>> +/* Function returns */
>>>> +enum csio_retval {
>>>> +	CSIO_SUCCESS = 0,
>>>> +	CSIO_INVAL = 1,
>>>> +	CSIO_BUSY = 2,
>>>> +	CSIO_NOSUPP = 3,
>>>> +	CSIO_TIMEOUT = 4,
>>>> +	CSIO_NOMEM = 5,
>>>> +	CSIO_NOPERM = 6,
>>>> +	CSIO_RETRY = 7,
>>>> +	CSIO_EPROTO = 8,
>>>> +	CSIO_EIO = 9,
>>>> +	CSIO_CANCELLED = 10,
>>>> +};
>>>> +
>>>
>>> Please don't assign macros for errno's, and give them positive values.
>>>
>>
>> Although some of these return values appear to be mapped to errno
>> values, there are others that do not have an errno equivalent (example
>> CSIO_CANCELLED). We may have future needs to have more driver/protocol
>> specific return values as well. What do you suggest?
>>
> 
> Convert all functions aside from CSIO_CANCELLED to use normal negative
> return values from include/asm-generic/error[-base].h
> 
> For the CSIO_CANCELLED case, propagate this status up to the specific
> caller using another method..
> 
>>>> +#define csio_retval_t enum csio_retval
>>>
>>> Please get rid of this csio_retval_t nonsense.
>>
>> I can get rid of the typedef and use enum csio_retval instead.
>>
> 
> Using a LLD defined retval where %90 of the items are from errno.h is
> code duplication.  Please get rid of this.
> 

OK I will switch over to the errno values.

>>>
>>>> +
>>>> +enum {
>>>> +	CSIO_FALSE = 0,
>>>> +	CSIO_TRUE = 1,
>>>> +};
>>>> +
>>>
>>> Same here, please use normal Boolean macros
>>>
>>>> +#define CSIO_ROUNDUP(__v, __r)		(((__v) + (__r) - 1) / (__r))
>>>> +#define CSIO_INVALID_IDX		0xFFFFFFFF
>>>> +#define csio_inc_stats(elem, val)	((elem)->stats.val++)
>>>> +#define csio_dec_stats(elem, val)	((elem)->stats.val--)
>>>
>>> No reason for either of this stats inc+dec macros.  Please drop them.
>>
>> I will get rid of them.
>>
>>>
>>>> +#define csio_valid_wwn(__n)		((*__n >> 4) == 0x5 ? CSIO_TRUE : \
>>>> +						CSIO_FALSE)
>>>> +#define CSIO_WORD_TO_BYTE		4
>>>> +
>>>> +static inline int
>>>> +csio_list_deleted(struct list_head *list)
>>>> +{
>>>> +	return ((list->next == list) && (list->prev == list));
>>>> +}
>>>> +
>>>> +#define csio_list_next(elem)	(((struct list_head *)(elem))->next)
>>>> +#define csio_list_prev(elem)	(((struct list_head *)(elem))->prev)
>>>> +
>>>> +#define csio_deq_from_head(head, elem)					  \
>>>> +do {									  \
>>>> +	if (!list_empty(head)) {					  \
>>>> +		*((struct list_head **)(elem)) = csio_list_next((head));  \
>>>> +		csio_list_next((head)) =				  \
>>>> +				csio_list_next(csio_list_next((head)));   \
>>>> +		csio_list_prev(csio_list_next((head))) = (head);	  \
>>>> +		INIT_LIST_HEAD(*((struct list_head **)(elem)));	          \
>>>> +	} else								  \
>>>> +		*((struct list_head **)(elem)) = (struct list_head *)NULL;\
>>>> +} while (0)
>>>> +
>>>
>>> This code is confusing as hell..  Why can't you just use normal list.h
>>> macros for this..?  
>>
>> I have not found an equivalent function in list.h that does the above
>> and the following macro. Could you please point me to it? I have seen a
>> couple of other drivers define their own macros to achieve what this
>> macro does, hence I assumed there isnt a list.h macro that does this.
>>
> 
> AFAICT all that csio_deq_from_head code is supposed to do is pull an
> item off a list, right..?  Why not just:
> 
>      while (!list_empty(list)) {
>             elem = list_first_entry(list, struct elem_type, 
>                                     elm_list);
>             list_del_init(&elem->elm_list);
> 
>             <do work>
>             <free *elem memory>
>      }
>

I will try to come up with a simpler static inline version of the macro.
Would that work?

>>>> +#define csio_deq_from_tail(head, elem)					  \
>>>> +do {									  \
>>>> +	if (!list_empty(head)) {					  \
>>>> +		*((struct list_head **)(elem)) = csio_list_prev((head));  \
>>>> +		csio_list_prev((head)) =				  \
>>>> +				csio_list_prev(csio_list_prev((head)));	  \
>>>> +		csio_list_next(csio_list_prev((head))) = (head);	  \
>>>> +		INIT_LIST_HEAD(*((struct list_head **)(elem)));		  \
>>>> +	} else								  \
>>>> +		*((struct list_head **)(elem)) = (struct list_head *)NULL;\
>>>> +} while (0)
>>>> +
>>>
>>> Same here..  Please don't use macros like this.
>>>
> 
> AFIACT csio_deq_from_tail is unused..?
> 
> Please remove it..
> 

I will remove it.