Netdev List
 help / color / mirror / Atom feed
* (unknown)
From: Loan Company Ltd @ 2013-02-17 12:47 UTC (permalink / raw)


DO YOU NEED A LEGIT LOAN OF 4%? E-MAIL US WITH FULL DETAILS:1.Name:2.Age:3.Phone Number:4.Country:5.Loan Amount.6.Duration.7.Sex

^ permalink raw reply

* Re: [PATCH 2/2] net: fec: Improve logging
From: Shawn Guo @ 2013-02-17 11:55 UTC (permalink / raw)
  To: Fabio Estevam; +Cc: davem, s.hauer, marex, netdev, Fabio Estevam
In-Reply-To: <1361055207-22870-2-git-send-email-festevam@gmail.com>

On Sat, Feb 16, 2013 at 08:53:27PM -0200, Fabio Estevam wrote:
> From: Fabio Estevam <fabio.estevam@freescale.com>
> 
> In case the request of the GPIO reset fails it is interesting to log
> such error even if DEBUG is not enabled, so promote the message to dev_err. 
> 
> Signed-off-by: Fabio Estevam <fabio.estevam@freescale.com>
> ---
>  drivers/net/ethernet/freescale/fec.c |    2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/drivers/net/ethernet/freescale/fec.c b/drivers/net/ethernet/freescale/fec.c
> index 5864a67..29d82cf 100644
> --- a/drivers/net/ethernet/freescale/fec.c
> +++ b/drivers/net/ethernet/freescale/fec.c
> @@ -1695,7 +1695,7 @@ static void fec_reset_phy(struct platform_device *pdev)
>  	err = devm_gpio_request_one(&pdev->dev, phy_reset,
>  				    GPIOF_OUT_INIT_LOW, "phy-reset");
>  	if (err) {
> -		pr_debug("FEC: failed to get gpio phy-reset: %d\n", err);
> +		dev_err(&pdev->dev, "failed to get phy-reset-gpios: %d\n", err);

Shouldn't dev_dbg be more like a equivalent of pr_debug?  The reason
why it's taken as a debug message rather than an error is that some
board design may not have reset line for phy.

Shawn

>  		return;
>  	}
>  	msleep(msec);
> -- 
> 1.7.9.5
> 

^ permalink raw reply

* Re: [PATCH 2/2] net: fec: Improve logging
From: Marek Vasut @ 2013-02-17 10:33 UTC (permalink / raw)
  To: Fabio Estevam; +Cc: davem, s.hauer, shawn.guo, netdev, Fabio Estevam
In-Reply-To: <1361055207-22870-2-git-send-email-festevam@gmail.com>

Dear Fabio Estevam,

> From: Fabio Estevam <fabio.estevam@freescale.com>
> 
> In case the request of the GPIO reset fails it is interesting to log
> such error even if DEBUG is not enabled, so promote the message to dev_err.
> 
> Signed-off-by: Fabio Estevam <fabio.estevam@freescale.com>

Acked-by: Marek Vasut <marex@denx.de>

Best regards,
Marek Vasut

^ permalink raw reply

* Re: [PATCH 1/2] net: fec: Do a sanity check on the gpio number
From: Marek Vasut @ 2013-02-17 10:32 UTC (permalink / raw)
  To: Fabio Estevam; +Cc: davem, s.hauer, shawn.guo, netdev, Fabio Estevam
In-Reply-To: <1361055207-22870-1-git-send-email-festevam@gmail.com>

Dear Fabio Estevam,

> From: Fabio Estevam <fabio.estevam@freescale.com>
> 
> Since commit 372e722ea4d (gpiolib: use descriptors internally) the
> following warning is seen on a mx28evk board:
[...]

I wonder if some dev_dbg() won't be a good idea here. Otherwise:

Acked-by: Marek Vasut <marex@denx.de>

Best regards,
Marek Vasut

^ permalink raw reply

* Re: [PATCH net-next 1/6] qlcnic: fix unsupported CDRP command error message.
From: Jitendra Kalsaria @ 2013-02-17  9:40 UTC (permalink / raw)
  To: Joe Perches; +Cc: David Miller, netdev, Sony Chacko, Dept-NX Linux NIC Driver
In-Reply-To: <1361079536.2001.5.camel@joe-AO722>



On 2/16/13 9:38 PM, "Joe Perches" <joe@perches.com> wrote:

>On Sat, 2013-02-16 at 23:53 -0500, Jitendra Kalsaria wrote:
>> From: Jitendra Kalsaria <jitendra.kalsaria@qlogic.com>
>> 
>> Add debug messages for FW CDRP command failure.
>
>These aren't debug messages but are more detailed.
>
>> diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ctx.c
>>b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ctx.c
>[]
>> @@ -147,8 +147,36 @@ int qlcnic_82xx_issue_cmd(struct qlcnic_adapter
>>*adapter,
>>  		cmd->rsp.arg[0] = QLCNIC_RCODE_TIMEOUT;
>>  	} else if (rsp == QLCNIC_CDRP_RSP_FAIL) {
>>  		cmd->rsp.arg[0] = QLCRD32(adapter, QLCNIC_CDRP_ARG(1));
>> -		dev_err(&pdev->dev, "failed card response code:0x%x\n",
>> -			cmd->rsp.arg[0]);
>> +		switch (cmd->rsp.arg[0]) {
>> +		case QLCNIC_RCODE_INVALID_ARGS:
>> +			dev_err(&pdev->dev, "CDRP invalid args 0x%x\n",
>> +				cmd->rsp.arg[0]);
>> +			break;
>
>Not sure you care about object size much, but
>it's much smaller object code to do:
>
>	const char *fmt;
>	switch (cmd->rsp.arg[0]);
>	case FOO:
>		fmt = "...";
>		break;
>	etc...
>	}
>
>	dev_err(&pdev->dev, fmt, cmd->rsp.arg[0]);
>
>Also, the #defines are decimal, I don't know why you
>print them out as hex or if you need to print them
>at all really.

Joe,

Yes, your suggestion will definitely reduce object code and we don't
really need
to print them all, will print in decimal. I will re-spin series and submit
again.

Thanks!
    Jiten

^ permalink raw reply

* Re: [PATCH v2 1/1] drivers: net: davinci_cpdma: acknowledge interrupt properly
From: Mugunthan V N @ 2013-02-17  9:35 UTC (permalink / raw)
  To: David Miller; +Cc: netdev, linux-arm-kernel, linux-omap
In-Reply-To: <20130215.150533.2127506748282656571.davem@davemloft.net>

On 2/16/2013 1:35 AM, David Miller wrote:
> Also please indicate, clearly, what tree your patch is targetted at.
Sorry for not mentioning the tree, will mention in the future patches.

Regards
Mugunthan V N

^ permalink raw reply

* Re: Universal tap device
From: Jiri Pirko @ 2013-02-17  9:35 UTC (permalink / raw)
  To: Arnd Bergmann
  Cc: Jan Engelhardt, netdev, ebiederm, stephen, eric.dumazet, davem
In-Reply-To: <201302162225.06536.arnd@arndb.de>

Sat, Feb 16, 2013 at 11:25:06PM CET, arnd@arndb.de wrote:
>On Saturday 16 February 2013, Jiri Pirko wrote:
>> Sat, Feb 16, 2013 at 05:46:25PM CET, jengelh@inai.de wrote:
>> >On Saturday 2013-02-16 15:01, Jiri Pirko wrote:
>> >
>> >>Hi all.                                                                  
>> >>                                                                         
>> >>Looking at macvtap and thinking about the tap solutions in general,
>> >>I think it would be handly to have some universal tap device.
>> >
>> >As in, allowing tuntap to register as an rx_handler for arbitrary
>> >devices?
>> 
>> Essentially yes, but I was thinking without the actual netdev:
>> not eth0 -> tap0 -> chardev
>> but eth0 -> chardev
>> 
>> Not sure though if that is easily doable..
>
>Isn't that the same as setting up macvtap in PASSTHRU mode?

Yep, but without netdev instance. That brings some issues. Maybe the
netdev instance should be there. Not sure.

>
>	Arnd

^ permalink raw reply

* Re: [PATCH v2 1/1] drivers: net: davinci_cpdma: acknowledge interrupt properly
From: Mugunthan V N @ 2013-02-17  9:34 UTC (permalink / raw)
  To: David Miller; +Cc: netdev, linux-arm-kernel, linux-omap
In-Reply-To: <20130215.150506.499818568035818118.davem@davemloft.net>

On 2/16/2013 1:35 AM, David Miller wrote:
> From: Mugunthan V N <mugunthanvnm@ti.com>
> Date: Thu, 14 Feb 2013 23:56:46 +0530
>
>> +enum {
>> +	CPDMA_EOI_RX_THRESH = 0,
>> +	CPDMA_EOI_RX,
>> +	CPDMA_EOI_TX,
>> +	CPDMA_EOI_MISC,
>> +};
> Do not use enumerations for hardware register values, which must be
> exact, otherwise you are potentially going to succumb to the vagaries
> of C language enumeration value assignment.
Will change enum to define and submit next version patch.

Regards
Mugunthan V N

^ permalink raw reply

* RE: [net-next 13/15] ixgbe: implement SFF diagnostic monitoring via ethtool
From: Tantilov, Emil S @ 2013-02-17  6:16 UTC (permalink / raw)
  To: Michal Miroslaw, Kirsher, Jeffrey T
  Cc: davem@davemloft.net, Aurélien Guillaume,
	netdev@vger.kernel.org, gospo@redhat.com, sassmann@redhat.com
In-Reply-To: <CAHXqBFKS9hPg23qAeiLjhk1uYk8BR=T+1+pZ1Pb5RcMr44Zs6Q@mail.gmail.com>

>-----Original Message-----
>From: Michał Mirosław [mailto:mirqus@gmail.com]
>Sent: Saturday, February 16, 2013 2:54 AM
>To: Kirsher, Jeffrey T
>Cc: davem@davemloft.net; Aurélien Guillaume; netdev@vger.kernel.org;
>gospo@redhat.com; sassmann@redhat.com; Tantilov, Emil S
>Subject: Re: [net-next 13/15] ixgbe: implement SFF diagnostic monitoring
>via ethtool
>
>2013/2/16 Jeff Kirsher <jeffrey.t.kirsher@intel.com>:
>> From: Aurélien Guillaume <footplus@gmail.com>
>>
>> This patch adds support for reading data from SFP+ modules over i2c.
>>
>> Signed-off-by: Aurélien Guillaume <footplus@gmail.com>
>> Signed-off-by: Emil Tantilov <emil.s.tantilov@intel.com>
>> Tested-by: Phil Schmitt <phillip.j.schmitt@intel.com>
>> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
>> ---
>>  drivers/net/ethernet/intel/ixgbe/ixgbe.h         |   1 +
>>  drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c | 114
>+++++++++++++++++++++++
>>  drivers/net/ethernet/intel/ixgbe/ixgbe_main.c    |   4 +
>>  3 files changed, 119 insertions(+)
>>
>> diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe.h
>b/drivers/net/ethernet/intel/ixgbe/ixgbe.h
>> index b91f9b6..196002b 100644
>> --- a/drivers/net/ethernet/intel/ixgbe/ixgbe.h
>> +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe.h
>> @@ -620,6 +620,7 @@ enum ixgbe_state_t {
>>         __IXGBE_DOWN,
>>         __IXGBE_SERVICE_SCHED,
>>         __IXGBE_IN_SFP_INIT,
>> +       __IXGBE_READ_I2C,
>>  };
>>
>>  struct ixgbe_cb {
>> diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c
>b/drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c
>> index 7349a8b..e6cebdc 100644
>> --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c
>> +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c
>> @@ -39,6 +39,7 @@
>>  #include <linux/uaccess.h>
>>
>>  #include "ixgbe.h"
>> +#include "ixgbe_phy.h"
>>
>>
>>  #define IXGBE_ALL_RAR_ENTRIES 16
>> @@ -2839,6 +2840,117 @@ static int ixgbe_set_channels(struct net_device
>*dev,
>>         return ixgbe_setup_tc(dev, netdev_get_num_tc(dev));
>>  }
>>
>> +static int ixgbe_get_module_info(struct net_device *dev,
>> +                                      struct ethtool_modinfo *modinfo)
>> +{
>> +       struct ixgbe_adapter *adapter = netdev_priv(dev);
>> +       struct ixgbe_hw *hw = &adapter->hw;
>> +       u32 status;
>> +       u8 sff8472_rev, addr_mode;
>> +       int ret_val = 0;
>> +       bool page_swap = false;
>> +
>> +       /* avoid concurent i2c reads */
>> +       while (test_bit(__IXGBE_IN_SFP_INIT, &adapter->state))
>> +               msleep(100);
>> +
>> +       /* used by the service task */
>> +       set_bit(__IXGBE_READ_I2C, &adapter->state);
>
>This is racy. Why do you need another bit?

The I2C bit helps to reduce the delay in the service task relative to the initialization of the SFP modules.

>
> while (test_and_set_bit(__IXGBE_IN_SFP_INIT, &adapter->state))
>       msleep(100);
>...
>  clear_bit(__IXGBE_IN_SFP_INIT, &adapter->state)

This is what I had initially, but the i2c reads can take a long time on some parts and __IXGBE_IN_SFP_INIT protects portions of the code that have nothing to do with I2C reads. Setting __IXGBE_IN_SFP_INIT in ethtool while dumping the SFF data can introduce needlessly long delays in the SFP initialization path.

Thanks,
Emil


>Best Regards,
>Michał Mirosław

^ permalink raw reply

* Re: [PATCH net-next 1/6] qlcnic: fix unsupported CDRP command error message.
From: Joe Perches @ 2013-02-17  5:38 UTC (permalink / raw)
  To: Jitendra Kalsaria; +Cc: davem, netdev, sony.chacko, Dept_NX_Linux_NIC_Driver
In-Reply-To: <1361076831-31746-2-git-send-email-jitendra.kalsaria@qlogic.com>

On Sat, 2013-02-16 at 23:53 -0500, Jitendra Kalsaria wrote:
> From: Jitendra Kalsaria <jitendra.kalsaria@qlogic.com>
> 
> Add debug messages for FW CDRP command failure.

These aren't debug messages but are more detailed.

> diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ctx.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ctx.c
[]
> @@ -147,8 +147,36 @@ int qlcnic_82xx_issue_cmd(struct qlcnic_adapter *adapter,
>  		cmd->rsp.arg[0] = QLCNIC_RCODE_TIMEOUT;
>  	} else if (rsp == QLCNIC_CDRP_RSP_FAIL) {
>  		cmd->rsp.arg[0] = QLCRD32(adapter, QLCNIC_CDRP_ARG(1));
> -		dev_err(&pdev->dev, "failed card response code:0x%x\n",
> -			cmd->rsp.arg[0]);
> +		switch (cmd->rsp.arg[0]) {
> +		case QLCNIC_RCODE_INVALID_ARGS:
> +			dev_err(&pdev->dev, "CDRP invalid args 0x%x\n",
> +				cmd->rsp.arg[0]);
> +			break;

Not sure you care about object size much, but
it's much smaller object code to do:

	const char *fmt;
	switch (cmd->rsp.arg[0]);
	case FOO:
		fmt = "...";
		break;
	etc...
	}

	dev_err(&pdev->dev, fmt, cmd->rsp.arg[0]);

Also, the #defines are decimal, I don't know why you
print them out as hex or if you need to print them
at all really.

^ permalink raw reply

* Re: [PATCH 1/2] net: fec: Do a sanity check on the gpio number
From: Shawn Guo @ 2013-02-17  5:32 UTC (permalink / raw)
  To: Fabio Estevam; +Cc: davem, s.hauer, marex, netdev, Fabio Estevam
In-Reply-To: <1361055207-22870-1-git-send-email-festevam@gmail.com>

On Sat, Feb 16, 2013 at 08:53:26PM -0200, Fabio Estevam wrote:
> From: Fabio Estevam <fabio.estevam@freescale.com>
> 
> Since commit 372e722ea4d (gpiolib: use descriptors internally) the following 
> warning is seen on a mx28evk board:
> 
> [    5.116291] ------------[ cut here ]------------
> [    5.121306] WARNING: at drivers/gpio/gpiolib.c:125 gpio_to_desc+0x30/0x44()
> [    5.128491] invalid GPIO -2
> [    5.131563] Modules linked in:
> [    5.134846] [<c0014e20>] (unwind_backtrace+0x0/0xf4) from [<c001d428>] (warn_slowpath_common+0x4c/0x68)
> [    5.144682] [<c001d428>] (warn_slowpath_common+0x4c/0x68) from [<c001d4d8>] (warn_slowpath_fmt+0x30/0x40)
> [    5.154693] [<c001d4d8>] (warn_slowpath_fmt+0x30/0x40) from [<c0283434>] (gpio_to_desc+0x30/0x44)
> [    5.164002] [<c0283434>] (gpio_to_desc+0x30/0x44) from [<c0285470>] (gpio_request_one+0x10/0xe8)
> [    5.173294] [<c0285470>] (gpio_request_one+0x10/0xe8) from [<c0282f50>] (devm_gpio_request_one+0x40/0x74)
> [    5.183332] [<c0282f50>] (devm_gpio_request_one+0x40/0x74) from [<c0319be0>] (fec_probe+0x2d0/0x99c)
> [    5.192923] [<c0319be0>] (fec_probe+0x2d0/0x99c) from [<c02c8114>] (platform_drv_probe+0x14/0x18)
> [    5.202228] [<c02c8114>] (platform_drv_probe+0x14/0x18) from [<c02c6e00>] (driver_probe_device+0x90/0x224)
> [    5.212332] [<c02c6e00>] (driver_probe_device+0x90/0x224) from [<c02c7028>] (__driver_attach+0x94/0x98)
> [    5.222162] [<c02c7028>] (__driver_attach+0x94/0x98) from [<c02c5750>] (bus_for_each_dev+0x78/0x98)
> [    5.231642] [<c02c5750>] (bus_for_each_dev+0x78/0x98) from [<c02c5fd0>] (bus_add_driver+0x1a4/0x240)
> [    5.241207] [<c02c5fd0>] (bus_add_driver+0x1a4/0x240) from [<c02c7608>] (driver_register+0x78/0x140)
> [    5.250768] [<c02c7608>] (driver_register+0x78/0x140) from [<c00087a4>] (do_one_initcall+0x30/0x17c)
> [    5.260347] [<c00087a4>] (do_one_initcall+0x30/0x17c) from [<c05fa29c>] (kernel_init_freeable+0xe8/0x1b0)
> [    5.270381] [<c05fa29c>] (kernel_init_freeable+0xe8/0x1b0) from [<c044dfd4>] (kernel_init+0x8/0xe4)
> [    5.279886] [<c044dfd4>] (kernel_init+0x8/0xe4) from [<c000f248>] (ret_from_fork+0x14/0x2c)
> [    5.288740] ---[ end trace c15c72a22979d58d ]--- 
> 
> mx28evk has two ethernet controllers. The GPIO that performs the 
> ethernet reset on both ports is the same GPIO, so on the board dts file, only in
> one ethernet instance is passed the GPIO reset property.
> 
> Validate the gpio number prior to requesting it in order to avoid such warning.
> 
> Signed-off-by: Fabio Estevam <fabio.estevam@freescale.com>

Both

Acked-by: Shawn Guo <shawn.guo@linaro.org>

^ permalink raw reply

* [PATCH net-next 6/6] qlcnic: Bump up the version to 5.1.34
From: Jitendra Kalsaria @ 2013-02-17  4:53 UTC (permalink / raw)
  To: davem; +Cc: netdev, sony.chacko, Dept_NX_Linux_NIC_Driver, Jitendra Kalsaria
In-Reply-To: <1361076831-31746-1-git-send-email-jitendra.kalsaria@qlogic.com>

From: Jitendra Kalsaria <jitendra.kalsaria@qlogic.com>

Signed-off-by: Jitendra Kalsaria <jitendra.kalsaria@qlogic.com>
---
 drivers/net/ethernet/qlogic/qlcnic/qlcnic.h |    4 ++--
 1 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic.h b/drivers/net/ethernet/qlogic/qlcnic/qlcnic.h
index 01e9ea1..11c3db6 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic.h
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic.h
@@ -38,8 +38,8 @@
 
 #define _QLCNIC_LINUX_MAJOR 5
 #define _QLCNIC_LINUX_MINOR 1
-#define _QLCNIC_LINUX_SUBVERSION 33
-#define QLCNIC_LINUX_VERSIONID  "5.1.33"
+#define _QLCNIC_LINUX_SUBVERSION 34
+#define QLCNIC_LINUX_VERSIONID  "5.1.34"
 #define QLCNIC_DRV_IDC_VER  0x01
 #define QLCNIC_DRIVER_VERSION  ((_QLCNIC_LINUX_MAJOR << 16) |\
 		 (_QLCNIC_LINUX_MINOR << 8) | (_QLCNIC_LINUX_SUBVERSION))
-- 
1.7.1

^ permalink raw reply related

* [PATCH net-next 4/6] qlcnic: fix estimation of receive MSS in case of LRO for 83xx adapter
From: Jitendra Kalsaria @ 2013-02-17  4:53 UTC (permalink / raw)
  To: davem; +Cc: netdev, sony.chacko, Dept_NX_Linux_NIC_Driver, Shahed Shaikh
In-Reply-To: <1361076831-31746-1-git-send-email-jitendra.kalsaria@qlogic.com>

From: Shahed Shaikh <shahed.shaikh@qlogic.com>

Set gso_size to MSS obtained from adapter to avoid incorrect estimation
of receive MSS, which would lead to delayed ACKs in some traffic patterns

Example:
Send two or three packets and wait for ack and only then send
remaining packets.

Signed-off-by: Shahed Shaikh <shahed.shaikh@qlogic.com>
Signed-off-by: Jitendra Kalsaria <jitendra.kalsaria@qlogic.com>
---
 .../net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.h    |    1 +
 drivers/net/ethernet/qlogic/qlcnic/qlcnic_io.c     |   13 ++++++++++-
 drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c   |   24 +++++++++++++------
 3 files changed, 29 insertions(+), 9 deletions(-)

diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.h b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.h
index 127fa27..61f81f6 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.h
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.h
@@ -223,6 +223,7 @@ struct qlc_83xx_idc {
 #define QLC_83XX_GET_LSO_CAPABILITY(val)		(val & 0x40)
 #define QLC_83XX_GET_HW_LRO_CAPABILITY(val)		(val & 0x400)
 #define QLC_83XX_GET_VLAN_ALIGN_CAPABILITY(val)	(val & 0x4000)
+#define QLC_83XX_GET_FW_LRO_MSS_CAPABILITY(val)	(val & 0x20000)
 #define QLC_83XX_VIRTUAL_NIC_MODE			0xFF
 #define QLC_83XX_DEFAULT_MODE				0x0
 #define QLCNIC_BRDTYPE_83XX_10G			0x0083
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_io.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_io.c
index 662292d..2990f45 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_io.c
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_io.c
@@ -88,6 +88,8 @@
 #define qlcnic_get_lro_sts_mss(sts_data1)		\
 	((sts_data1 >> 32) & 0x0FFFF)
 
+#define qlcnic_83xx_get_lro_sts_mss(sts) ((sts) & 0xffff)
+
 /* opcode field in status_desc */
 #define QLCNIC_SYN_OFFLOAD	0x03
 #define QLCNIC_RXPKT_DESC  	0x04
@@ -1423,7 +1425,7 @@ qlcnic_83xx_process_lro(struct qlcnic_adapter *adapter,
 	bool push;
 	int l2_hdr_offset, l4_hdr_offset;
 	int index;
-	u16 lro_length, length, data_offset;
+	u16 lro_length, length, data_offset, gso_size;
 	u16 vid = 0xffff;
 
 	if (unlikely(ring > adapter->max_rds_rings))
@@ -1478,6 +1480,15 @@ qlcnic_83xx_process_lro(struct qlcnic_adapter *adapter,
 	th->psh = push;
 	length = skb->len;
 
+	if (adapter->flags & QLCNIC_FW_LRO_MSS_CAP) {
+		gso_size = qlcnic_83xx_get_lro_sts_mss(sts_data[0]);
+		skb_shinfo(skb)->gso_size = gso_size;
+		if (skb->protocol == htons(ETH_P_IPV6))
+			skb_shinfo(skb)->gso_type = SKB_GSO_TCPV6;
+		else
+			skb_shinfo(skb)->gso_type = SKB_GSO_TCPV4;
+	}
+
 	if (vid != 0xffff)
 		__vlan_hwaccel_put_tag(skb, vid);
 
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c
index 3a0f182..e03017a 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c
@@ -1339,11 +1339,24 @@ qlcnic_free_irq(struct qlcnic_adapter *adapter)
 	}
 }
 
+static void qlcnic_get_lro_mss_capability(struct qlcnic_adapter *adapter)
+{
+	u32 capab = 0;
+
+	if (qlcnic_82xx_check(adapter)) {
+		if (adapter->ahw->capabilities2 &
+		    QLCNIC_FW_CAPABILITY_2_LRO_MAX_TCP_SEG)
+			adapter->flags |= QLCNIC_FW_LRO_MSS_CAP;
+	} else {
+		capab = adapter->ahw->capabilities;
+		if (QLC_83XX_GET_FW_LRO_MSS_CAPABILITY(capab))
+			adapter->flags |= QLCNIC_FW_LRO_MSS_CAP;
+	}
+}
+
 int __qlcnic_up(struct qlcnic_adapter *adapter, struct net_device *netdev)
 {
 	int ring;
-	u32 capab2;
-
 	struct qlcnic_host_rds_ring *rds_ring;
 
 	if (adapter->is_up != QLCNIC_ADAPTER_UP_MAGIC)
@@ -1353,12 +1366,7 @@ int __qlcnic_up(struct qlcnic_adapter *adapter, struct net_device *netdev)
 		return 0;
 	if (qlcnic_set_eswitch_port_config(adapter))
 		return -EIO;
-
-	if (adapter->ahw->capabilities & QLCNIC_FW_CAPABILITY_MORE_CAPS) {
-		capab2 = QLCRD32(adapter, CRB_FW_CAPABILITIES_2);
-		if (capab2 & QLCNIC_FW_CAPABILITY_2_LRO_MAX_TCP_SEG)
-			adapter->flags |= QLCNIC_FW_LRO_MSS_CAP;
-	}
+	qlcnic_get_lro_mss_capability(adapter);
 
 	if (qlcnic_fw_create_ctx(adapter))
 		return -EIO;
-- 
1.7.1

^ permalink raw reply related

* [PATCH net-next 3/6] qlcnic: refactor Legacy interrupt handling for 83xx
From: Jitendra Kalsaria @ 2013-02-17  4:53 UTC (permalink / raw)
  To: davem; +Cc: netdev, sony.chacko, Dept_NX_Linux_NIC_Driver, Himanshu Madhani
In-Reply-To: <1361076831-31746-1-git-send-email-jitendra.kalsaria@qlogic.com>

From: Himanshu Madhani <himanshu.madhani@qlogic.com>

o Cleanly seperate 83xx Legacy interrupt handling code from 82xx
o Update 83xx Legacy interrupt handling code to match with the spec

Signed-off-by: Himanshu Madhani <himanshu.madhani@qlogic.com>
Signed-off-by: Jitendra Kalsaria <jitendra.kalsaria@qlogic.com>
---
 .../net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c    |  135 +++++++++++++++++---
 .../net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.h    |    3 +
 drivers/net/ethernet/qlogic/qlcnic/qlcnic_io.c     |   30 +----
 drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c   |   37 ++++--
 4 files changed, 148 insertions(+), 57 deletions(-)

diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c
index e92cc52..4b9e062 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c
@@ -388,12 +388,45 @@ int qlcnic_83xx_setup_intr(struct qlcnic_adapter *adapter, u8 num_intr)
 	return 0;
 }
 
-inline void qlcnic_83xx_enable_intr(struct qlcnic_adapter *adapter,
-				    struct qlcnic_host_sds_ring *sds_ring)
+inline void qlcnic_83xx_clear_legacy_intr_mask(struct qlcnic_adapter *adapter)
+{
+	writel(0, adapter->tgt_mask_reg);
+}
+
+/* Enable MSI-x and INT-x interrupts */
+void qlcnic_83xx_enable_intr(struct qlcnic_adapter *adapter,
+			     struct qlcnic_host_sds_ring *sds_ring)
 {
 	writel(0, sds_ring->crb_intr_mask);
-	if (!QLCNIC_IS_MSI_FAMILY(adapter))
-		writel(0, adapter->tgt_mask_reg);
+}
+
+/* Disable MSI-x and INT-x interrupts */
+void qlcnic_83xx_disable_intr(struct qlcnic_adapter *adapter,
+			      struct qlcnic_host_sds_ring *sds_ring)
+{
+	writel(1, sds_ring->crb_intr_mask);
+}
+
+inline void qlcnic_83xx_enable_legacy_msix_mbx_intr(struct qlcnic_adapter
+						    *adapter)
+{
+	u32 mask;
+
+	/* Mailbox in MSI-x mode and Legacy Interrupt share the same
+	 * source register. We could be here before contexts are created
+	 * and sds_ring->crb_intr_mask has not been initialized, calculate
+	 * BAR offset for Interrupt Source Register
+	 */
+	mask = QLCRDX(adapter->ahw, QLCNIC_DEF_INT_MASK);
+	writel(0, adapter->ahw->pci_base0 + mask);
+}
+
+inline void qlcnic_83xx_disable_mbx_intr(struct qlcnic_adapter *adapter)
+{
+	u32 mask;
+
+	mask = QLCRDX(adapter->ahw, QLCNIC_DEF_INT_MASK);
+	writel(1, adapter->ahw->pci_base0 + mask);
 }
 
 static inline void qlcnic_83xx_get_mbx_data(struct qlcnic_adapter *adapter,
@@ -419,23 +452,66 @@ irqreturn_t qlcnic_83xx_clear_legacy_intr(struct qlcnic_adapter *adapter)
 		adapter->stats.spurious_intr++;
 		return IRQ_NONE;
 	}
+	/* The barrier is required to ensure writes to the registers */
+	wmb();
+
 	/* clear the interrupt trigger control register */
 	writel(0, adapter->isr_int_vec);
+	intr_val = readl(adapter->isr_int_vec);
 	do {
 		intr_val = readl(adapter->tgt_status_reg);
 		if (QLC_83XX_INTX_FUNC(intr_val) != ahw->pci_func)
 			break;
 		retries++;
 	} while (QLC_83XX_VALID_INTX_BIT30(intr_val) &&
-		 (retries < QLC_83XX_LEGACY_INTX_MAX_RETRY));
+		(retries < QLC_83XX_LEGACY_INTX_MAX_RETRY));
 
-	if (retries == QLC_83XX_LEGACY_INTX_MAX_RETRY) {
-		dev_info(&adapter->pdev->dev,
-			 "Reached maximum retries to clear legacy interrupt\n");
+	return IRQ_HANDLED;
+}
+
+static void qlcnic_83xx_poll_process_aen(struct qlcnic_adapter *adapter)
+{
+	u32 resp, event;
+
+	if (!spin_trylock(&adapter->ahw->mbx_lock)) {
+		qlcnic_83xx_enable_legacy_msix_mbx_intr(adapter);
+		return;
+	}
+
+	resp = QLCRDX(adapter->ahw, QLCNIC_FW_MBX_CTRL);
+	if (!(resp & QLCNIC_SET_OWNER))
+		goto out;
+	event = readl(QLCNIC_MBX_FW(adapter->ahw, 0));
+	if (event &  QLCNIC_MBX_ASYNC_EVENT)
+		qlcnic_83xx_process_aen(adapter);
+out:
+	qlcnic_83xx_enable_legacy_msix_mbx_intr(adapter);
+	spin_unlock(&adapter->ahw->mbx_lock);
+}
+
+irqreturn_t qlcnic_83xx_intr(int irq, void *data)
+{
+	struct qlcnic_adapter *adapter = data;
+	struct qlcnic_host_sds_ring *sds_ring;
+	struct qlcnic_hardware_context *ahw = adapter->ahw;
+
+	if (qlcnic_83xx_clear_legacy_intr(adapter) == IRQ_NONE)
 		return IRQ_NONE;
+
+	qlcnic_83xx_poll_process_aen(adapter);
+
+	if (ahw->diag_test == QLCNIC_INTERRUPT_TEST) {
+		ahw->diag_cnt++;
+		qlcnic_83xx_enable_legacy_msix_mbx_intr(adapter);
+		return IRQ_HANDLED;
 	}
 
-	mdelay(QLC_83XX_LEGACY_INTX_DELAY);
+	if (!test_bit(__QLCNIC_DEV_UP, &adapter->state)) {
+		qlcnic_83xx_enable_legacy_msix_mbx_intr(adapter);
+	} else {
+		sds_ring = &adapter->recv_ctx->sds_rings[0];
+		napi_schedule(&sds_ring->napi);
+	}
 
 	return IRQ_HANDLED;
 }
@@ -460,14 +536,20 @@ done:
 
 void qlcnic_83xx_free_mbx_intr(struct qlcnic_adapter *adapter)
 {
-	u32 val = 0;
-	u32 num_msix = adapter->ahw->num_msix - 1;
+	u32 val = 0, num_msix = adapter->ahw->num_msix - 1;
 
-	val = (num_msix << 8);
+	if (adapter->flags & QLCNIC_MSIX_ENABLED)
+		num_msix = adapter->ahw->num_msix - 1;
+	else
+		num_msix = 0;
 
 	QLCWRX(adapter->ahw, QLCNIC_MBX_INTR_ENBL, val);
-	if (adapter->flags & QLCNIC_MSIX_ENABLED)
-		free_irq(adapter->msix_entries[num_msix].vector, adapter);
+
+	qlcnic_83xx_disable_mbx_intr(adapter);
+
+	msleep(20);
+	synchronize_irq(adapter->msix_entries[num_msix].vector);
+	free_irq(adapter->msix_entries[num_msix].vector, adapter);
 }
 
 int qlcnic_83xx_setup_mbx_intr(struct qlcnic_adapter *adapter)
@@ -486,13 +568,23 @@ int qlcnic_83xx_setup_mbx_intr(struct qlcnic_adapter *adapter)
 		handler = qlcnic_83xx_handle_aen;
 		val = adapter->msix_entries[adapter->ahw->num_msix - 1].vector;
 		snprintf(name, (IFNAMSIZ + 4),
-			 "%s[%s]", adapter->netdev->name, "aen");
+			 "%s[%s]", "qlcnic", "aen");
 		err = request_irq(val, handler, flags, name, adapter);
 		if (err) {
 			dev_err(&adapter->pdev->dev,
 				"failed to register MBX interrupt\n");
 			return err;
 		}
+	} else {
+		handler = qlcnic_83xx_intr;
+		val = adapter->msix_entries[0].vector;
+		err = request_irq(val, handler, flags, "qlcnic", adapter);
+		if (err) {
+			dev_err(&adapter->pdev->dev,
+				"failed to register INTx interrupt\n");
+			return err;
+		}
+		qlcnic_83xx_clear_legacy_intr_mask(adapter);
 	}
 
 	/* Enable mailbox interrupt */
@@ -604,6 +696,7 @@ void qlcnic_83xx_enable_mbx_intrpt(struct qlcnic_adapter *adapter)
 		val = BIT_2;
 
 	QLCWRX(adapter->ahw, QLCNIC_MBX_INTR_ENBL, val);
+	qlcnic_83xx_enable_legacy_msix_mbx_intr(adapter);
 }
 
 void qlcnic_83xx_check_vf(struct qlcnic_adapter *adapter,
@@ -1194,7 +1287,7 @@ static void qlcnic_83xx_diag_free_res(struct net_device *netdev,
 	if (adapter->ahw->diag_test == QLCNIC_INTERRUPT_TEST) {
 		for (ring = 0; ring < adapter->max_sds_rings; ring++) {
 			sds_ring = &adapter->recv_ctx->sds_rings[ring];
-			writel(1, sds_ring->crb_intr_mask);
+			qlcnic_83xx_disable_intr(adapter, sds_ring);
 		}
 	}
 
@@ -1723,20 +1816,24 @@ static void qlcnic_83xx_handle_link_aen(struct qlcnic_adapter *adapter,
 irqreturn_t qlcnic_83xx_handle_aen(int irq, void *data)
 {
 	struct qlcnic_adapter *adapter = data;
-	unsigned long flags;
 	u32 mask, resp, event;
 
-	spin_lock_irqsave(&adapter->ahw->mbx_lock, flags);
+	if (!spin_trylock(&adapter->ahw->mbx_lock)) {
+		qlcnic_83xx_enable_legacy_msix_mbx_intr(adapter);
+		return IRQ_HANDLED;
+	}
+
 	resp = QLCRDX(adapter->ahw, QLCNIC_FW_MBX_CTRL);
 	if (!(resp & QLCNIC_SET_OWNER))
 		goto out;
+
 	event = readl(QLCNIC_MBX_FW(adapter->ahw, 0));
 	if (event &  QLCNIC_MBX_ASYNC_EVENT)
 		qlcnic_83xx_process_aen(adapter);
 out:
 	mask = QLCRDX(adapter->ahw, QLCNIC_DEF_INT_MASK);
 	writel(0, adapter->ahw->pci_base0 + mask);
-	spin_unlock_irqrestore(&adapter->ahw->mbx_lock, flags);
+	spin_unlock(&adapter->ahw->mbx_lock);
 
 	return IRQ_HANDLED;
 }
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.h b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.h
index f60e28a..127fa27 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.h
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.h
@@ -368,9 +368,12 @@ irqreturn_t qlcnic_83xx_handle_aen(int, void *);
 int qlcnic_83xx_get_port_info(struct qlcnic_adapter *);
 void qlcnic_83xx_enable_mbx_intrpt(struct qlcnic_adapter *);
 irqreturn_t qlcnic_83xx_clear_legacy_intr(struct qlcnic_adapter *);
+irqreturn_t qlcnic_83xx_intr(int, void *);
 irqreturn_t qlcnic_83xx_tmp_intr(int, void *);
 void qlcnic_83xx_enable_intr(struct qlcnic_adapter *,
 			     struct qlcnic_host_sds_ring *);
+void qlcnic_83xx_disable_intr(struct qlcnic_adapter *,
+			     struct qlcnic_host_sds_ring *);
 void qlcnic_83xx_check_vf(struct qlcnic_adapter *,
 			  const struct pci_device_id *);
 void qlcnic_83xx_process_aen(struct qlcnic_adapter *);
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_io.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_io.c
index 93839f8..662292d 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_io.c
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_io.c
@@ -1558,24 +1558,6 @@ skip:
 	return count;
 }
 
-static void qlcnic_83xx_poll_process_aen(struct qlcnic_adapter *adapter)
-{
-	unsigned long flags;
-	u32 mask, resp, event;
-
-	spin_lock_irqsave(&adapter->ahw->mbx_lock, flags);
-	resp = QLCRDX(adapter->ahw, QLCNIC_FW_MBX_CTRL);
-	if (!(resp & QLCNIC_SET_OWNER))
-		goto out;
-	event = readl(QLCNIC_MBX_FW(adapter->ahw, 0));
-	if (event &  QLCNIC_MBX_ASYNC_EVENT)
-		qlcnic_83xx_process_aen(adapter);
-out:
-	mask = QLCRDX(adapter->ahw, QLCNIC_DEF_INT_MASK);
-	writel(0, adapter->ahw->pci_base0 + mask);
-	spin_unlock_irqrestore(&adapter->ahw->mbx_lock, flags);
-}
-
 static int qlcnic_83xx_poll(struct napi_struct *napi, int budget)
 {
 	int tx_complete;
@@ -1589,15 +1571,11 @@ static int qlcnic_83xx_poll(struct napi_struct *napi, int budget)
 	/* tx ring count = 1 */
 	tx_ring = adapter->tx_ring;
 
-	if (!(adapter->flags & QLCNIC_MSIX_ENABLED))
-		qlcnic_83xx_poll_process_aen(adapter);
-
 	tx_complete = qlcnic_process_cmd_ring(adapter, tx_ring, budget);
 	work_done = qlcnic_83xx_process_rcv_ring(sds_ring, budget);
 	if ((work_done < budget) && tx_complete) {
 		napi_complete(&sds_ring->napi);
-		if (test_bit(__QLCNIC_DEV_UP, &adapter->state))
-			qlcnic_83xx_enable_intr(adapter, sds_ring);
+		qlcnic_83xx_enable_intr(adapter, sds_ring);
 	}
 
 	return work_done;
@@ -1653,7 +1631,8 @@ void qlcnic_83xx_napi_enable(struct qlcnic_adapter *adapter)
 	for (ring = 0; ring < adapter->max_sds_rings; ring++) {
 		sds_ring = &recv_ctx->sds_rings[ring];
 		napi_enable(&sds_ring->napi);
-		qlcnic_83xx_enable_intr(adapter, sds_ring);
+		if (adapter->flags & QLCNIC_MSIX_ENABLED)
+			qlcnic_83xx_enable_intr(adapter, sds_ring);
 	}
 
 	if (adapter->flags & QLCNIC_MSIX_ENABLED) {
@@ -1677,7 +1656,8 @@ void qlcnic_83xx_napi_disable(struct qlcnic_adapter *adapter)
 
 	for (ring = 0; ring < adapter->max_sds_rings; ring++) {
 		sds_ring = &recv_ctx->sds_rings[ring];
-		writel(1, sds_ring->crb_intr_mask);
+		if (adapter->flags & QLCNIC_MSIX_ENABLED)
+			qlcnic_83xx_disable_intr(adapter, sds_ring);
 		napi_synchronize(&sds_ring->napi);
 		napi_disable(&sds_ring->napi);
 	}
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c
index f084dc1..3a0f182 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c
@@ -1269,20 +1269,27 @@ qlcnic_request_irq(struct qlcnic_adapter *adapter)
 			handler = qlcnic_msi_intr;
 		else {
 			flags |= IRQF_SHARED;
-			handler = qlcnic_intr;
+			if (qlcnic_82xx_check(adapter))
+				handler = qlcnic_intr;
+			else
+				handler = qlcnic_83xx_intr;
 		}
 	}
 	adapter->irq = netdev->irq;
 
 	if (adapter->ahw->diag_test != QLCNIC_LOOPBACK_TEST) {
-		for (ring = 0; ring < adapter->max_sds_rings; ring++) {
-			sds_ring = &recv_ctx->sds_rings[ring];
-			snprintf(sds_ring->name, sizeof(int) + IFNAMSIZ,
-				 "%s[%d]", netdev->name, ring);
-			err = request_irq(sds_ring->irq, handler, flags,
-					  sds_ring->name, sds_ring);
-			if (err)
-				return err;
+		if (qlcnic_82xx_check(adapter) ||
+		    (qlcnic_83xx_check(adapter) &&
+		     (adapter->flags & QLCNIC_MSIX_ENABLED))) {
+			for (ring = 0; ring < adapter->max_sds_rings; ring++) {
+				sds_ring = &recv_ctx->sds_rings[ring];
+				snprintf(sds_ring->name, sizeof(int) + IFNAMSIZ,
+					 "%s[%d]", netdev->name, ring);
+				err = request_irq(sds_ring->irq, handler, flags,
+						  sds_ring->name, sds_ring);
+				if (err)
+					return err;
+			}
 		}
 		if (qlcnic_83xx_check(adapter) &&
 		    (adapter->flags & QLCNIC_MSIX_ENABLED)) {
@@ -1292,7 +1299,7 @@ qlcnic_request_irq(struct qlcnic_adapter *adapter)
 				tx_ring = &adapter->tx_ring[ring];
 				snprintf(tx_ring->name, sizeof(int) + IFNAMSIZ,
 					 "%s[%d]", netdev->name,
-				adapter->max_sds_rings + ring);
+					 adapter->max_sds_rings + ring);
 				err = request_irq(tx_ring->irq, handler, flags,
 						  tx_ring->name, tx_ring);
 				if (err)
@@ -1313,9 +1320,13 @@ qlcnic_free_irq(struct qlcnic_adapter *adapter)
 	struct qlcnic_recv_context *recv_ctx = adapter->recv_ctx;
 
 	if (adapter->ahw->diag_test != QLCNIC_LOOPBACK_TEST) {
-		for (ring = 0; ring < adapter->max_sds_rings; ring++) {
-			sds_ring = &recv_ctx->sds_rings[ring];
-			free_irq(sds_ring->irq, sds_ring);
+		if (qlcnic_82xx_check(adapter) ||
+		    (qlcnic_83xx_check(adapter) &&
+		     (adapter->flags & QLCNIC_MSIX_ENABLED))) {
+			for (ring = 0; ring < adapter->max_sds_rings; ring++) {
+				sds_ring = &recv_ctx->sds_rings[ring];
+				free_irq(sds_ring->irq, sds_ring);
+			}
 		}
 		if (qlcnic_83xx_check(adapter)) {
 			for (ring = 0; ring < adapter->max_drv_tx_rings;
-- 
1.7.1

^ permalink raw reply related

* [PATCH net-next 2/6] qlcnic: fix mailbox interrupt.
From: Jitendra Kalsaria @ 2013-02-17  4:53 UTC (permalink / raw)
  To: davem; +Cc: netdev, sony.chacko, Dept_NX_Linux_NIC_Driver,
	Sucheta Chakraborty
In-Reply-To: <1361076831-31746-1-git-send-email-jitendra.kalsaria@qlogic.com>

From: Sucheta Chakraborty <sucheta.chakraborty@qlogic.com>

o Config interrupt is not needed for mailbox interrupts.

Signed-off-by: Sucheta Chakraborty <sucheta.chakraborty@qlogic.com>
Signed-off-by: Jitendra Kalsaria <jitendra.kalsaria@qlogic.com>
---
 .../net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c    |    4 +--
 drivers/net/ethernet/qlogic/qlcnic/qlcnic_ctx.c    |   27 +++++++++++++++++--
 drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c   |   17 +++---------
 3 files changed, 29 insertions(+), 19 deletions(-)

diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c
index f7b39d1..e92cc52 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c
@@ -497,8 +497,6 @@ int qlcnic_83xx_setup_mbx_intr(struct qlcnic_adapter *adapter)
 
 	/* Enable mailbox interrupt */
 	qlcnic_83xx_enable_mbx_intrpt(adapter);
-	if (adapter->flags & QLCNIC_MSIX_ENABLED)
-		err = qlcnic_83xx_config_intrpt(adapter, 1);
 
 	return err;
 }
@@ -1915,7 +1913,7 @@ int qlcnic_83xx_config_intrpt(struct qlcnic_adapter *adapter, bool op_type)
 	u32 val, temp;
 	struct qlcnic_cmd_args cmd;
 
-	max_ints = adapter->ahw->num_msix;
+	max_ints = adapter->ahw->num_msix - 1;
 	qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_CONFIG_INTRPT);
 	cmd.req.arg[1] = max_ints;
 	for (i = 0, index = 2; i < max_ints; i++) {
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ctx.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ctx.c
index 51461ad..938b0ee 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ctx.c
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ctx.c
@@ -606,9 +606,17 @@ int qlcnic_fw_create_ctx(struct qlcnic_adapter *dev)
 		dev->flags &= ~QLCNIC_NEED_FLR;
 	}
 
+	if (qlcnic_83xx_check(dev) && (dev->flags & QLCNIC_MSIX_ENABLED)) {
+		if (dev->ahw->diag_test != QLCNIC_LOOPBACK_TEST) {
+			err = qlcnic_83xx_config_intrpt(dev, 1);
+			if (err)
+				return err;
+		}
+	}
+
 	err = qlcnic_fw_cmd_create_rx_ctx(dev);
 	if (err)
-		return err;
+		goto err_out;
 
 	for (ring = 0; ring < dev->max_drv_tx_rings; ring++) {
 		err = qlcnic_fw_cmd_create_tx_ctx(dev,
@@ -617,18 +625,25 @@ int qlcnic_fw_create_ctx(struct qlcnic_adapter *dev)
 		if (err) {
 			qlcnic_fw_cmd_destroy_rx_ctx(dev);
 			if (ring == 0)
-				return err;
+				goto err_out;
 
 			for (i = 0; i < ring; i++)
 				qlcnic_fw_cmd_destroy_tx_ctx(dev,
 							     &dev->tx_ring[i]);
 
-			return err;
+			goto err_out;
 		}
 	}
 
 	set_bit(__QLCNIC_FW_ATTACHED, &dev->state);
 	return 0;
+
+err_out:
+	if (qlcnic_83xx_check(dev) && (dev->flags & QLCNIC_MSIX_ENABLED)) {
+		if (dev->ahw->diag_test != QLCNIC_LOOPBACK_TEST)
+			qlcnic_83xx_config_intrpt(dev, 0);
+	}
+	return err;
 }
 
 void qlcnic_fw_destroy_ctx(struct qlcnic_adapter *adapter)
@@ -640,6 +655,12 @@ void qlcnic_fw_destroy_ctx(struct qlcnic_adapter *adapter)
 		for (ring = 0; ring < adapter->max_drv_tx_rings; ring++)
 			qlcnic_fw_cmd_destroy_tx_ctx(adapter,
 						     &adapter->tx_ring[ring]);
+
+		if (qlcnic_83xx_check(adapter) &&
+		    (adapter->flags & QLCNIC_MSIX_ENABLED)) {
+			if (adapter->ahw->diag_test != QLCNIC_LOOPBACK_TEST)
+				qlcnic_83xx_config_intrpt(adapter, 0);
+		}
 		/* Allow dma queues to drain after context reset */
 		mdelay(20);
 	}
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c
index b953168..f084dc1 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c
@@ -1965,11 +1965,8 @@ qlcnic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
 	return 0;
 
 err_out_disable_mbx_intr:
-	if (qlcnic_83xx_check(adapter)) {
-		if (adapter->flags & QLCNIC_MSIX_ENABLED)
-			qlcnic_83xx_config_intrpt(adapter, 0);
+	if (qlcnic_83xx_check(adapter))
 		qlcnic_83xx_free_mbx_intr(adapter);
-	}
 
 err_out_disable_msi:
 	qlcnic_teardown_intr(adapter);
@@ -2015,8 +2012,6 @@ static void qlcnic_remove(struct pci_dev *pdev)
 	unregister_netdev(netdev);
 
 	if (qlcnic_83xx_check(adapter)) {
-		if (adapter->flags & QLCNIC_MSIX_ENABLED)
-			qlcnic_83xx_config_intrpt(adapter, 0);
 		qlcnic_83xx_free_mbx_intr(adapter);
 		qlcnic_83xx_register_nic_idc_func(adapter, 0);
 		cancel_delayed_work_sync(&adapter->idc_aen_work);
@@ -3107,8 +3102,6 @@ static pci_ers_result_t qlcnic_io_error_detected(struct pci_dev *pdev,
 		qlcnic_down(adapter, netdev);
 
 	if (qlcnic_83xx_check(adapter)) {
-		if (adapter->flags & QLCNIC_MSIX_ENABLED)
-			qlcnic_83xx_config_intrpt(adapter, 0);
 		qlcnic_83xx_free_mbx_intr(adapter);
 		qlcnic_83xx_register_nic_idc_func(adapter, 0);
 		cancel_delayed_work_sync(&adapter->idc_aen_work);
@@ -3203,13 +3196,11 @@ int qlcnic_set_max_rss(struct qlcnic_adapter *adapter, u8 data, size_t len)
 	if (netif_running(netdev))
 		__qlcnic_down(adapter, netdev);
 
-	if (qlcnic_83xx_check(adapter)) {
-		if (adapter->flags & QLCNIC_MSIX_ENABLED)
-			qlcnic_83xx_config_intrpt(adapter, 0);
+	qlcnic_detach(adapter);
+
+	if (qlcnic_83xx_check(adapter))
 		qlcnic_83xx_free_mbx_intr(adapter);
-	}
 
-	qlcnic_detach(adapter);
 	qlcnic_teardown_intr(adapter);
 	err = qlcnic_setup_intr(adapter, data);
 	if (err) {
-- 
1.7.1

^ permalink raw reply related

* [PATCH net-next 1/6] qlcnic: fix unsupported CDRP command error message.
From: Jitendra Kalsaria @ 2013-02-17  4:53 UTC (permalink / raw)
  To: davem; +Cc: netdev, sony.chacko, Dept_NX_Linux_NIC_Driver, Jitendra Kalsaria
In-Reply-To: <1361076831-31746-1-git-send-email-jitendra.kalsaria@qlogic.com>

From: Jitendra Kalsaria <jitendra.kalsaria@qlogic.com>

Add debug messages for FW CDRP command failure.

Signed-off-by: Jitendra Kalsaria <jitendra.kalsaria@qlogic.com>
---
 drivers/net/ethernet/qlogic/qlcnic/qlcnic_ctx.c |   32 +++++++++++++++++++++-
 1 files changed, 30 insertions(+), 2 deletions(-)

diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ctx.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ctx.c
index 4a3bd64..51461ad 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ctx.c
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ctx.c
@@ -147,8 +147,36 @@ int qlcnic_82xx_issue_cmd(struct qlcnic_adapter *adapter,
 		cmd->rsp.arg[0] = QLCNIC_RCODE_TIMEOUT;
 	} else if (rsp == QLCNIC_CDRP_RSP_FAIL) {
 		cmd->rsp.arg[0] = QLCRD32(adapter, QLCNIC_CDRP_ARG(1));
-		dev_err(&pdev->dev, "failed card response code:0x%x\n",
-			cmd->rsp.arg[0]);
+		switch (cmd->rsp.arg[0]) {
+		case QLCNIC_RCODE_INVALID_ARGS:
+			dev_err(&pdev->dev, "CDRP invalid args 0x%x\n",
+				cmd->rsp.arg[0]);
+			break;
+		case QLCNIC_RCODE_NOT_SUPPORTED:
+		case QLCNIC_RCODE_NOT_IMPL:
+			dev_err(&pdev->dev,
+				"CDRP command not supported: 0x%x.\n",
+				cmd->rsp.arg[0]);
+			break;
+		case QLCNIC_RCODE_NOT_PERMITTED:
+			dev_err(&pdev->dev,
+				"CDRP requested action not permitted: 0x%x.\n",
+				cmd->rsp.arg[0]);
+			break;
+		case QLCNIC_RCODE_INVALID:
+			dev_err(&pdev->dev,
+				"CDRP invalid or unknown cmd received: 0x%x.\n",
+				cmd->rsp.arg[0]);
+			break;
+		case QLCNIC_RCODE_TIMEOUT:
+			dev_err(&pdev->dev, "CDRP command timeout: 0x%x.\n",
+				cmd->rsp.arg[0]);
+			break;
+		default:
+			dev_err(&pdev->dev, "CDRP command failed: 0x%x.\n",
+				cmd->rsp.arg[0]);
+			break;
+		}
 	} else if (rsp == QLCNIC_CDRP_RSP_OK)
 		cmd->rsp.arg[0] = QLCNIC_RCODE_SUCCESS;
 
-- 
1.7.1

^ permalink raw reply related

* [PATCH net-next 0/6] qlcnic: bug fixes and feature updates
From: Jitendra Kalsaria @ 2013-02-17  4:53 UTC (permalink / raw)
  To: davem; +Cc: netdev, sony.chacko, Dept_NX_Linux_NIC_Driver, Jitendra Kalsaria

From: Jitendra Kalsaria <jitendra.kalsaria@qlogic.com>

Patch#1 "qlcnic: fix unsupported CDRP command error message" with commit id 
"e42ede226c067fef541e4240f919ed2baf25d268" is a re-submission. We are re-submitting
the same patch because this patch got undone by the recent driver refactoring.

Please apply to net-next.

Thanks,
Jitendra

^ permalink raw reply

* Re: [PATCH net-next v2 1/4] ipv6: introduce new type ipv6_addr_props to hold ipv6 address type and scope
From: Hannes Frederic Sowa @ 2013-02-17  3:01 UTC (permalink / raw)
  To: YOSHIFUJI Hideaki; +Cc: netdev, brian.haley
In-Reply-To: <512045EA.9090309@linux-ipv6.org>

On Sun, Feb 17, 2013 at 11:52:26AM +0900, YOSHIFUJI Hideaki wrote:
> > Sorry, I am a bit confused. The missing '& IPV6_ADDR_SCOPE_MASK' is clearly a
> > bug. I implied a bitmask for the IPV6_ADDR_SCOPE_* macros. But I don't
> > understand to what you do refer in your second mail.
> > 
> 
> No, return __ipv6_addr_type(addr).type & IPV6_ADDR_SCOPE_MASK, see?

Got it, thanks.

> You have changed too many things in a single patch.
> Please do not try to change function arguments, and so on
> e.g. if original takes int by __ipv6_addr_type() value, please leave
> it semantics as is.
> 
> I think you can concentrate on your original work for multicast/scoping
> issues first.

Ok, will do.

Thanks,

  Hannes

^ permalink raw reply

* Re: [PATCH net-next v2 1/4] ipv6: introduce new type ipv6_addr_props to hold ipv6 address type and scope
From: YOSHIFUJI Hideaki @ 2013-02-17  2:52 UTC (permalink / raw)
  To: netdev, brian.haley, Hannes Frederic Sowa, YOSHIFUJI Hideaki
In-Reply-To: <20130217014718.GA28547@order.stressinduktion.org>

Hannes Frederic Sowa wrote:
> On Sun, Feb 17, 2013 at 08:31:52AM +0900, YOSHIFUJI Hideaki wrote:
>>>> -extern int __ipv6_addr_type(const struct in6_addr *addr);
>>>> -static inline int ipv6_addr_type(const struct in6_addr *addr)
>>>> +struct ipv6_addr_props {
>>>> +	u16 type;
>>>> +	s16 scope;
>>>> +};
>>>> +
>>>> +extern struct ipv6_addr_props __ipv6_addr_props(const struct in6_addr *addr);
>>>> +static inline unsigned int ipv6_addr_type(const struct in6_addr *addr)
>>>>  {
>>>> -	return __ipv6_addr_type(addr) & 0xffff;
>>>> +	return __ipv6_addr_props(addr).type;
>>>>  }
>>>>  
>>>>  static inline int ipv6_addr_scope(const struct in6_addr *addr)
>>>>  {
>>>> -	return __ipv6_addr_type(addr) & IPV6_ADDR_SCOPE_MASK;
>>>> +	return __ipv6_addr_props(addr).scope;
>>>>  }
>>>>  
>>>
>>> NAK.  This does not return correct value as before.
>>> If you are going to covert this, please do not try to
>>> change usage of inlines.  
>>
>> I meant
>>
>> struct ipv6_addrtype {
>> 	__u16 type;
>> 	__s16 scope;
>> };
>>
>> struct ipv6_addrtype __ipv6_addr_type(const struct in6_addr *addr);
>> int ipv6_addr_type(const struct in6_addr *addr)
>> {
>> 	return __ipv6_addr_type(addr).type;
>> }
>>
>> And most users should not be touched except for it type name
>> (int => struct addrtype).
> 
> Sorry, I am a bit confused. The missing '& IPV6_ADDR_SCOPE_MASK' is clearly a
> bug. I implied a bitmask for the IPV6_ADDR_SCOPE_* macros. But I don't
> understand to what you do refer in your second mail.
> 

No, return __ipv6_addr_type(addr).type & IPV6_ADDR_SCOPE_MASK, see?

You have changed too many things in a single patch.
Please do not try to change function arguments, and so on
e.g. if original takes int by __ipv6_addr_type() value, please leave
it semantics as is.

I think you can concentrate on your original work for multicast/scoping
issues first.

Thanks.

--yoshfuji

^ permalink raw reply

* Re: [PATCH net-next v2 1/4] ipv6: introduce new type ipv6_addr_props to hold ipv6 address type and scope
From: Hannes Frederic Sowa @ 2013-02-17  1:47 UTC (permalink / raw)
  To: YOSHIFUJI Hideaki; +Cc: netdev, brian.haley
In-Reply-To: <512016E8.30305@linux-ipv6.org>

On Sun, Feb 17, 2013 at 08:31:52AM +0900, YOSHIFUJI Hideaki wrote:
> >> -extern int __ipv6_addr_type(const struct in6_addr *addr);
> >> -static inline int ipv6_addr_type(const struct in6_addr *addr)
> >> +struct ipv6_addr_props {
> >> +	u16 type;
> >> +	s16 scope;
> >> +};
> >> +
> >> +extern struct ipv6_addr_props __ipv6_addr_props(const struct in6_addr *addr);
> >> +static inline unsigned int ipv6_addr_type(const struct in6_addr *addr)
> >>  {
> >> -	return __ipv6_addr_type(addr) & 0xffff;
> >> +	return __ipv6_addr_props(addr).type;
> >>  }
> >>  
> >>  static inline int ipv6_addr_scope(const struct in6_addr *addr)
> >>  {
> >> -	return __ipv6_addr_type(addr) & IPV6_ADDR_SCOPE_MASK;
> >> +	return __ipv6_addr_props(addr).scope;
> >>  }
> >>  
> > 
> > NAK.  This does not return correct value as before.
> > If you are going to covert this, please do not try to
> > change usage of inlines.  
> 
> I meant
> 
> struct ipv6_addrtype {
> 	__u16 type;
> 	__s16 scope;
> };
> 
> struct ipv6_addrtype __ipv6_addr_type(const struct in6_addr *addr);
> int ipv6_addr_type(const struct in6_addr *addr)
> {
> 	return __ipv6_addr_type(addr).type;
> }
> 
> And most users should not be touched except for it type name
> (int => struct addrtype).

Sorry, I am a bit confused. The missing '& IPV6_ADDR_SCOPE_MASK' is clearly a
bug. I implied a bitmask for the IPV6_ADDR_SCOPE_* macros. But I don't
understand to what you do refer in your second mail.

^ permalink raw reply

* Re: [PATCH net-next v2 1/4] ipv6: introduce new type ipv6_addr_props to hold ipv6 address type and scope
From: YOSHIFUJI Hideaki @ 2013-02-17  0:05 UTC (permalink / raw)
  To: netdev, brian.haley, hannes
In-Reply-To: <20130216191008.GA23272@order.stressinduktion.org>

Hannes Frederic Sowa wrote:

> diff --git a/net/ipv6/addrconf_core.c b/net/ipv6/addrconf_core.c
> index d051e5f..99cb205 100644
> --- a/net/ipv6/addrconf_core.c
> +++ b/net/ipv6/addrconf_core.c
> @@ -6,75 +6,104 @@
>  #include <linux/export.h>
>  #include <net/ipv6.h>
>  
> -#define IPV6_ADDR_SCOPE_TYPE(scope)	((scope) << 16)
> -
> -static inline unsigned int ipv6_addr_scope2type(unsigned int scope)
> +static inline struct ipv6_addr_props ipv6_addr_mc_props(unsigned int scope)
>  {
>  	switch (scope) {
>  	case IPV6_ADDR_SCOPE_NODELOCAL:
> -		return (IPV6_ADDR_SCOPE_TYPE(IPV6_ADDR_SCOPE_NODELOCAL) |
> -			IPV6_ADDR_LOOPBACK);
> +		return (struct ipv6_addr_props){
> +			.type = IPV6_ADDR_MULTICAST|IPV6_ADDR_LOOPBACK,
> +			.scope = IPV6_ADDR_SCOPE_NODELOCAL
> +		};
>  	case IPV6_ADDR_SCOPE_LINKLOCAL:
> -		return (IPV6_ADDR_SCOPE_TYPE(IPV6_ADDR_SCOPE_LINKLOCAL) |
> -			IPV6_ADDR_LINKLOCAL);
> +		return (struct ipv6_addr_props){
> +			.type = IPV6_ADDR_MULTICAST|IPV6_ADDR_LINKLOCAL,
> +			.scope = IPV6_ADDR_SCOPE_LINKLOCAL
> +		};
>  	case IPV6_ADDR_SCOPE_SITELOCAL:
> -		return (IPV6_ADDR_SCOPE_TYPE(IPV6_ADDR_SCOPE_SITELOCAL) |
> -			IPV6_ADDR_SITELOCAL);
> +		return (struct ipv6_addr_props){
> +			.type = IPV6_ADDR_MULTICAST|IPV6_ADDR_SITELOCAL,
> +			.scope = IPV6_ADDR_SCOPE_SITELOCAL
> +		};
>  	}
> -	return IPV6_ADDR_SCOPE_TYPE(scope);
> +	return (struct ipv6_addr_props){
> +		.type = IPV6_ADDR_MULTICAST,
> +		.scope = scope
> +	};
>  }
>  
> -int __ipv6_addr_type(const struct in6_addr *addr)
> +struct ipv6_addr_props __ipv6_addr_props(const struct in6_addr *addr)
>  {
> -	__be32 st;
> -
> -	st = addr->s6_addr32[0];
> +	__be32 st = addr->s6_addr32[0];
>  
>  	/* Consider all addresses with the first three bits different of
>  	   000 and 111 as unicasts.
>  	 */
>  	if ((st & htonl(0xE0000000)) != htonl(0x00000000) &&
>  	    (st & htonl(0xE0000000)) != htonl(0xE0000000))
> -		return (IPV6_ADDR_UNICAST |
> -			IPV6_ADDR_SCOPE_TYPE(IPV6_ADDR_SCOPE_GLOBAL));
> +		return (struct ipv6_addr_props){
> +			.type = IPV6_ADDR_UNICAST,
> +			.scope = IPV6_ADDR_SCOPE_GLOBAL
> +		};
>  
>  	if ((st & htonl(0xFF000000)) == htonl(0xFF000000)) {
>  		/* multicast */
>  		/* addr-select 3.1 */
> -		return (IPV6_ADDR_MULTICAST |
> -			ipv6_addr_scope2type(IPV6_ADDR_MC_SCOPE(addr)));
> +		return ipv6_addr_mc_props(IPV6_ADDR_MC_SCOPE(addr));
>  	}
>  
>  	if ((st & htonl(0xFFC00000)) == htonl(0xFE800000))
> -		return (IPV6_ADDR_LINKLOCAL | IPV6_ADDR_UNICAST |
> -			IPV6_ADDR_SCOPE_TYPE(IPV6_ADDR_SCOPE_LINKLOCAL));		/* addr-select 3.1 */
> +		/* addr-select 3.1 */
> +		return (struct ipv6_addr_props){
> +			.type = IPV6_ADDR_LINKLOCAL|IPV6_ADDR_UNICAST,
> +			.scope = IPV6_ADDR_SCOPE_LINKLOCAL
> +		};
>  	if ((st & htonl(0xFFC00000)) == htonl(0xFEC00000))
> -		return (IPV6_ADDR_SITELOCAL | IPV6_ADDR_UNICAST |
> -			IPV6_ADDR_SCOPE_TYPE(IPV6_ADDR_SCOPE_SITELOCAL));		/* addr-select 3.1 */
> +		/* addr-select 3.1 */
> +		return (struct ipv6_addr_props){
> +			.type = IPV6_ADDR_SITELOCAL|IPV6_ADDR_UNICAST,
> +			.scope = IPV6_ADDR_SCOPE_SITELOCAL,
> +		};
>  	if ((st & htonl(0xFE000000)) == htonl(0xFC000000))
> -		return (IPV6_ADDR_UNICAST |
> -			IPV6_ADDR_SCOPE_TYPE(IPV6_ADDR_SCOPE_GLOBAL));			/* RFC 4193 */
> +		/* RFC 4193 */
> +		return (struct ipv6_addr_props){
> +			.type = IPV6_ADDR_UNICAST,
> +			.scope = IPV6_ADDR_SCOPE_GLOBAL,
> +		};
>  
>  	if ((addr->s6_addr32[0] | addr->s6_addr32[1]) == 0) {
>  		if (addr->s6_addr32[2] == 0) {
>  			if (addr->s6_addr32[3] == 0)
> -				return IPV6_ADDR_ANY;
> +				return (struct ipv6_addr_props){
> +					.type = IPV6_ADDR_ANY
> +				};
>  
>  			if (addr->s6_addr32[3] == htonl(0x00000001))
> -				return (IPV6_ADDR_LOOPBACK | IPV6_ADDR_UNICAST |
> -					IPV6_ADDR_SCOPE_TYPE(IPV6_ADDR_SCOPE_LINKLOCAL));	/* addr-select 3.4 */
> +				/* addr-select 3.4 */
> +				return (struct ipv6_addr_props){
> +					.type = IPV6_ADDR_LOOPBACK|
> +						IPV6_ADDR_UNICAST,
> +					.scope = IPV6_ADDR_SCOPE_LINKLOCAL
> +				};
>  
> -			return (IPV6_ADDR_COMPATv4 | IPV6_ADDR_UNICAST |
> -				IPV6_ADDR_SCOPE_TYPE(IPV6_ADDR_SCOPE_GLOBAL));	/* addr-select 3.3 */
> +			/* addr-select 3.3 */
> +			return (struct ipv6_addr_props){
> +				.type = IPV6_ADDR_COMPATv4|IPV6_ADDR_UNICAST,
> +				.scope = IPV6_ADDR_SCOPE_GLOBAL
> +			};
>  		}
>  
>  		if (addr->s6_addr32[2] == htonl(0x0000ffff))
> -			return (IPV6_ADDR_MAPPED |
> -				IPV6_ADDR_SCOPE_TYPE(IPV6_ADDR_SCOPE_GLOBAL));	/* addr-select 3.3 */
> +			/* addr-select 3.3 */
> +			return (struct ipv6_addr_props){
> +				.type = IPV6_ADDR_MAPPED,
> +				.scope = IPV6_ADDR_SCOPE_GLOBAL
> +			};
>  	}
>  
> -	return (IPV6_ADDR_UNICAST |
> -		IPV6_ADDR_SCOPE_TYPE(IPV6_ADDR_SCOPE_GLOBAL));	/* addr-select 3.4 */
> +	/* addr-select 3.4 */
> +	return (struct ipv6_addr_props){
> +		.type = IPV6_ADDR_UNICAST,
> +		.scope = IPV6_ADDR_SCOPE_GLOBAL
> +	};
>  }
> -EXPORT_SYMBOL(__ipv6_addr_type);
> -
> +EXPORT_SYMBOL(__ipv6_addr_props);

Sorry, I disagree.  This generates worse code.

--yoshfuji

^ permalink raw reply

* Re: [PATCH net-next v2 1/4] ipv6: introduce new type ipv6_addr_props to hold ipv6 address type and scope
From: YOSHIFUJI Hideaki @ 2013-02-16 23:31 UTC (permalink / raw)
  To: hannes; +Cc: YOSHIFUJI Hideaki, netdev, brian.haley
In-Reply-To: <512013B8.3000608@linux-ipv6.org>

YOSHIFUJI Hideaki wrote:
> Hannes Frederic Sowa wrote:
>> This simplifies ipv6 address type handling. The old implementation had
>> the problem that scope and type where both squeezed into one int. Because
>> of this it was dangerous to do comparisons on it or check for scope while
>> it is actually being stripped out. This patch mainly improves type safety.
>>
>> v2:
>> a) Incorportated feedback from Brian Haley
>> b) fix style in addrconf_core.c:__ipv6_addr_props
>>
>> Cc: YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
>> Cc: Brian Haley <brian.haley@hp.com>
>> Signed-off-by: Hannes Frederic Sowa <hannes@stressinduktion.org>
>> ---
>>  include/net/ipv6.h       | 20 ++++++----
>>  net/ipv6/addrconf.c      | 28 +++++++-------
>>  net/ipv6/addrconf_core.c | 99 +++++++++++++++++++++++++++++++-----------------
>>  net/ipv6/datagram.c      | 12 +++---
>>  4 files changed, 99 insertions(+), 60 deletions(-)
>>
>> diff --git a/include/net/ipv6.h b/include/net/ipv6.h
>> index 851d541..a14700c 100644
>> --- a/include/net/ipv6.h
>> +++ b/include/net/ipv6.h
>> @@ -298,25 +298,31 @@ static inline int ip6_frag_mem(struct net *net)
>>  #define IPV6_FRAG_LOW_THRESH	(3 * 1024*1024)	/* 3145728 */
>>  #define IPV6_FRAG_TIMEOUT	(60 * HZ)	/* 60 seconds */
>>  
>> -extern int __ipv6_addr_type(const struct in6_addr *addr);
>> -static inline int ipv6_addr_type(const struct in6_addr *addr)
>> +struct ipv6_addr_props {
>> +	u16 type;
>> +	s16 scope;
>> +};
>> +
>> +extern struct ipv6_addr_props __ipv6_addr_props(const struct in6_addr *addr);
>> +static inline unsigned int ipv6_addr_type(const struct in6_addr *addr)
>>  {
>> -	return __ipv6_addr_type(addr) & 0xffff;
>> +	return __ipv6_addr_props(addr).type;
>>  }
>>  
>>  static inline int ipv6_addr_scope(const struct in6_addr *addr)
>>  {
>> -	return __ipv6_addr_type(addr) & IPV6_ADDR_SCOPE_MASK;
>> +	return __ipv6_addr_props(addr).scope;
>>  }
>>  
> 
> NAK.  This does not return correct value as before.
> If you are going to covert this, please do not try to
> change usage of inlines.  

I meant

struct ipv6_addrtype {
	__u16 type;
	__s16 scope;
};

struct ipv6_addrtype __ipv6_addr_type(const struct in6_addr *addr);
int ipv6_addr_type(const struct in6_addr *addr)
{
	return __ipv6_addr_type(addr).type;
}

And most users should not be touched except for it type name
(int => struct addrtype).

--yohsfuji

^ permalink raw reply

* Dear Email User
From: Lin Wei Chou @ 2013-02-16 23:17 UTC (permalink / raw)


We are currently undergoing email maintenance to prevent your account from 
closing, you are required to VERIFY your account.

click email link below; http://goo.gl/8S7PM

Warning! All web mail account owners who refuse to update his or her account 
within two days of receiving this MESSAGE will lose his or her account 
permanently. 

Thank you for using our webmail service. 
Webmaster

^ permalink raw reply

* Re: [PATCH net-next v2 1/4] ipv6: introduce new type ipv6_addr_props to hold ipv6 address type and scope
From: YOSHIFUJI Hideaki @ 2013-02-16 23:18 UTC (permalink / raw)
  To: netdev, brian.haley, hannes, YOSHIFUJI Hideaki
In-Reply-To: <20130216191008.GA23272@order.stressinduktion.org>

Hannes Frederic Sowa wrote:
> This simplifies ipv6 address type handling. The old implementation had
> the problem that scope and type where both squeezed into one int. Because
> of this it was dangerous to do comparisons on it or check for scope while
> it is actually being stripped out. This patch mainly improves type safety.
> 
> v2:
> a) Incorportated feedback from Brian Haley
> b) fix style in addrconf_core.c:__ipv6_addr_props
> 
> Cc: YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
> Cc: Brian Haley <brian.haley@hp.com>
> Signed-off-by: Hannes Frederic Sowa <hannes@stressinduktion.org>
> ---
>  include/net/ipv6.h       | 20 ++++++----
>  net/ipv6/addrconf.c      | 28 +++++++-------
>  net/ipv6/addrconf_core.c | 99 +++++++++++++++++++++++++++++++-----------------
>  net/ipv6/datagram.c      | 12 +++---
>  4 files changed, 99 insertions(+), 60 deletions(-)
> 
> diff --git a/include/net/ipv6.h b/include/net/ipv6.h
> index 851d541..a14700c 100644
> --- a/include/net/ipv6.h
> +++ b/include/net/ipv6.h
> @@ -298,25 +298,31 @@ static inline int ip6_frag_mem(struct net *net)
>  #define IPV6_FRAG_LOW_THRESH	(3 * 1024*1024)	/* 3145728 */
>  #define IPV6_FRAG_TIMEOUT	(60 * HZ)	/* 60 seconds */
>  
> -extern int __ipv6_addr_type(const struct in6_addr *addr);
> -static inline int ipv6_addr_type(const struct in6_addr *addr)
> +struct ipv6_addr_props {
> +	u16 type;
> +	s16 scope;
> +};
> +
> +extern struct ipv6_addr_props __ipv6_addr_props(const struct in6_addr *addr);
> +static inline unsigned int ipv6_addr_type(const struct in6_addr *addr)
>  {
> -	return __ipv6_addr_type(addr) & 0xffff;
> +	return __ipv6_addr_props(addr).type;
>  }
>  
>  static inline int ipv6_addr_scope(const struct in6_addr *addr)
>  {
> -	return __ipv6_addr_type(addr) & IPV6_ADDR_SCOPE_MASK;
> +	return __ipv6_addr_props(addr).scope;
>  }
>  

NAK.  This does not return correct value as before.
If you are going to covert this, please do not try to
change usage of inlines.  

--yoshfuji

^ permalink raw reply

* [PATCH 1/2] net: fec: Do a sanity check on the gpio number
From: Fabio Estevam @ 2013-02-16 22:53 UTC (permalink / raw)
  To: davem; +Cc: s.hauer, shawn.guo, marex, netdev, Fabio Estevam

From: Fabio Estevam <fabio.estevam@freescale.com>

Since commit 372e722ea4d (gpiolib: use descriptors internally) the following 
warning is seen on a mx28evk board:

[    5.116291] ------------[ cut here ]------------
[    5.121306] WARNING: at drivers/gpio/gpiolib.c:125 gpio_to_desc+0x30/0x44()
[    5.128491] invalid GPIO -2
[    5.131563] Modules linked in:
[    5.134846] [<c0014e20>] (unwind_backtrace+0x0/0xf4) from [<c001d428>] (warn_slowpath_common+0x4c/0x68)
[    5.144682] [<c001d428>] (warn_slowpath_common+0x4c/0x68) from [<c001d4d8>] (warn_slowpath_fmt+0x30/0x40)
[    5.154693] [<c001d4d8>] (warn_slowpath_fmt+0x30/0x40) from [<c0283434>] (gpio_to_desc+0x30/0x44)
[    5.164002] [<c0283434>] (gpio_to_desc+0x30/0x44) from [<c0285470>] (gpio_request_one+0x10/0xe8)
[    5.173294] [<c0285470>] (gpio_request_one+0x10/0xe8) from [<c0282f50>] (devm_gpio_request_one+0x40/0x74)
[    5.183332] [<c0282f50>] (devm_gpio_request_one+0x40/0x74) from [<c0319be0>] (fec_probe+0x2d0/0x99c)
[    5.192923] [<c0319be0>] (fec_probe+0x2d0/0x99c) from [<c02c8114>] (platform_drv_probe+0x14/0x18)
[    5.202228] [<c02c8114>] (platform_drv_probe+0x14/0x18) from [<c02c6e00>] (driver_probe_device+0x90/0x224)
[    5.212332] [<c02c6e00>] (driver_probe_device+0x90/0x224) from [<c02c7028>] (__driver_attach+0x94/0x98)
[    5.222162] [<c02c7028>] (__driver_attach+0x94/0x98) from [<c02c5750>] (bus_for_each_dev+0x78/0x98)
[    5.231642] [<c02c5750>] (bus_for_each_dev+0x78/0x98) from [<c02c5fd0>] (bus_add_driver+0x1a4/0x240)
[    5.241207] [<c02c5fd0>] (bus_add_driver+0x1a4/0x240) from [<c02c7608>] (driver_register+0x78/0x140)
[    5.250768] [<c02c7608>] (driver_register+0x78/0x140) from [<c00087a4>] (do_one_initcall+0x30/0x17c)
[    5.260347] [<c00087a4>] (do_one_initcall+0x30/0x17c) from [<c05fa29c>] (kernel_init_freeable+0xe8/0x1b0)
[    5.270381] [<c05fa29c>] (kernel_init_freeable+0xe8/0x1b0) from [<c044dfd4>] (kernel_init+0x8/0xe4)
[    5.279886] [<c044dfd4>] (kernel_init+0x8/0xe4) from [<c000f248>] (ret_from_fork+0x14/0x2c)
[    5.288740] ---[ end trace c15c72a22979d58d ]--- 

mx28evk has two ethernet controllers. The GPIO that performs the 
ethernet reset on both ports is the same GPIO, so on the board dts file, only in
one ethernet instance is passed the GPIO reset property.

Validate the gpio number prior to requesting it in order to avoid such warning.

Signed-off-by: Fabio Estevam <fabio.estevam@freescale.com>
---
 drivers/net/ethernet/freescale/fec.c |    3 +++
 1 file changed, 3 insertions(+)

diff --git a/drivers/net/ethernet/freescale/fec.c b/drivers/net/ethernet/freescale/fec.c
index 0fe68c4..5864a67 100644
--- a/drivers/net/ethernet/freescale/fec.c
+++ b/drivers/net/ethernet/freescale/fec.c
@@ -1689,6 +1689,9 @@ static void fec_reset_phy(struct platform_device *pdev)
 		msec = 1;
 
 	phy_reset = of_get_named_gpio(np, "phy-reset-gpios", 0);
+	if (!gpio_is_valid(phy_reset))
+		return;
+
 	err = devm_gpio_request_one(&pdev->dev, phy_reset,
 				    GPIOF_OUT_INIT_LOW, "phy-reset");
 	if (err) {
-- 
1.7.9.5

^ permalink raw reply related


This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox