RE: [PATCH -next] scsi: qedi: remove set but not used variables 'cdev' and 'udev'

2019-05-09 Thread Manish Rangankar


> -Original Message-
> From: linux-scsi-ow...@vger.kernel.org  ow...@vger.kernel.org> On Behalf Of Yue Haibing
> Sent: Wednesday, April 24, 2019 1:33 PM
> To: qlogic-storage-upstr...@cavium.com; j...@linux.ibm.com;
> martin.peter...@oracle.com
> Cc: linux-ker...@vger.kernel.org; linux-scsi@vger.kernel.org; YueHaibing
> 
> Subject: [PATCH -next] scsi: qedi: remove set but not used variables 'cdev'
> and 'udev'
> 
> From: YueHaibing 
> 
> Fixes gcc '-Wunused-but-set-variable' warning:
> 
> drivers/scsi/qedi/qedi_iscsi.c: In function 'qedi_ep_connect':
> drivers/scsi/qedi/qedi_iscsi.c:813:23: warning: variable 'udev' set but not
> used [-Wunused-but-set-variable]
> drivers/scsi/qedi/qedi_iscsi.c:812:18: warning: variable 'cdev' set but not
> used [-Wunused-but-set-variable]
> 
> They are never used since introduction.
> 
> Signed-off-by: YueHaibing 
> ---
>  drivers/scsi/qedi/qedi_iscsi.c | 4 
>  1 file changed, 4 deletions(-)
> 
> diff --git a/drivers/scsi/qedi/qedi_iscsi.c b/drivers/scsi/qedi/qedi_iscsi.c
> index e4391ee..688a6d8 100644
> --- a/drivers/scsi/qedi/qedi_iscsi.c
> +++ b/drivers/scsi/qedi/qedi_iscsi.c
> @@ -809,8 +809,6 @@ qedi_ep_connect(struct Scsi_Host *shost, struct
> sockaddr *dst_addr,
>   struct qedi_endpoint *qedi_ep;
>   struct sockaddr_in *addr;
>   struct sockaddr_in6 *addr6;
> - struct qed_dev *cdev  =  NULL;
> - struct qedi_uio_dev *udev = NULL;
>   struct iscsi_path path_req;
>   u32 msg_type = ISCSI_KEVENT_IF_DOWN;
>   u32 iscsi_cid = QEDI_CID_RESERVED;
> @@ -830,8 +828,6 @@ qedi_ep_connect(struct Scsi_Host *shost, struct
> sockaddr *dst_addr,
>   }
> 
>   qedi = iscsi_host_priv(shost);
> -     cdev = qedi->cdev;
> - udev = qedi->udev;
> 
>   if (test_bit(QEDI_IN_OFFLINE, &qedi->flags) ||
>   test_bit(QEDI_IN_RECOVERY, &qedi->flags)) {
> --
> 2.7.4
> 

Thanks,

Acked-by: Manish Rangankar 


[PATCH v2 0/2] Ramrod timer and ep state fixes.

2019-04-26 Thread Manish Rangankar
Hi Martin,

Please apply the following patches to the scsi tree at your
earliest convenience.

Changes from v1 -> v2
- Updated commit with description.

Thanks,
Manish

Manish Rangankar (2):
  qedi: Abort ep termination if offload not scheduled.
  qedi: Adjust termination and offload ramrod timers.

 drivers/scsi/qedi/qedi_iscsi.c | 8 ++--
 1 file changed, 6 insertions(+), 2 deletions(-)

-- 
1.8.3.1



[PATCH v2 1/2] qedi: Abort ep termination if offload not scheduled.

2019-04-26 Thread Manish Rangankar
Sometimes during connection recovery when there is a
failure to resolve ARP, and offload connection was not
issued, driver tries to flush pending offload connection
work which was not queued up.

kernel: WARNING: CPU: 19 PID: 10110 at kernel/workqueue.c:3030 
__flush_work.isra.34+0x19c/0x1b0
kernel: CPU: 19 PID: 10110 Comm: iscsid Tainted: G W 5.1.0-rc4 #11
kernel: Hardware name: Dell Inc. PowerEdge R730/0599V5, BIOS 2.9.1 12/04/2018
kernel: RIP: 0010:__flush_work.isra.34+0x19c/0x1b0
kernel: Code: 8b fb 66 0f 1f 44 00 00 31 c0 eb ab 48 89 ef c6 07 00 0f 1f 40 00 
fb 66 0f 1f 44 00 00 31 c0 eb 96 e8 08 16 fe ff 0f 0b eb 8d <0f> 0b 31 c0 eb 87 
0f 1f 40 00 66 2e 0f 1
f 84 00 00 00 00 00 0f 1f
kernel: RSP: 0018:a6b4054dba68 EFLAGS: 00010246
kernel: RAX:  RBX: 91df21c36fc0 RCX: 
kernel: RDX: 0001 RSI:  RDI: 91df21c36fc0
kernel: RBP: 91df21c36ef0 R08:  R09: 
kernel: R10: 0038 R11: a6b4054dbd60 R12: c05e72c0
kernel: R13: 91db10280820 R14: 0048 R15: 
kernel: FS:  7f5d83cc1740() GS:91df2f84() 
knlGS:
kernel: CS:  0010 DS:  ES:  CR0: 80050033
kernel: CR2: 01cc5000 CR3: 000465450002 CR4: 001606e0
kernel: Call Trace:
kernel: ? try_to_del_timer_sync+0x4d/0x80
kernel: qedi_ep_disconnect+0x3b/0x410 [qedi]
kernel: ? 0xc083c000
kernel: ? klist_iter_exit+0x14/0x20
kernel: ? class_find_device+0x93/0xf0
kernel: iscsi_if_ep_disconnect.isra.18+0x58/0x70 [scsi_transport_iscsi]
kernel: iscsi_if_recv_msg+0x10e2/0x1510 [scsi_transport_iscsi]
kernel: ? copyout+0x22/0x30
kernel: ? _copy_to_iter+0xa0/0x430
kernel: ? _cond_resched+0x15/0x30
kernel: ? __kmalloc_node_track_caller+0x1f9/0x270
kernel: iscsi_if_rx+0xa5/0x1e0 [scsi_transport_iscsi]
kernel: netlink_unicast+0x17f/0x230
kernel: netlink_sendmsg+0x2d2/0x3d0
kernel: sock_sendmsg+0x36/0x50
kernel: ___sys_sendmsg+0x280/0x2a0
kernel: ? timerqueue_add+0x54/0x80
kernel: ? enqueue_hrtimer+0x38/0x90
kernel: ? hrtimer_start_range_ns+0x19f/0x2c0
kernel: __sys_sendmsg+0x58/0xa0
kernel: do_syscall_64+0x5b/0x180
kernel: entry_SYSCALL_64_after_hwframe+0x44/0xa9

Signed-off-by: Manish Rangankar 
---
 drivers/scsi/qedi/qedi_iscsi.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/drivers/scsi/qedi/qedi_iscsi.c b/drivers/scsi/qedi/qedi_iscsi.c
index 6d6d601..bf371e7 100644
--- a/drivers/scsi/qedi/qedi_iscsi.c
+++ b/drivers/scsi/qedi/qedi_iscsi.c
@@ -1000,6 +1000,9 @@ static void qedi_ep_disconnect(struct iscsi_endpoint *ep)
qedi_ep = ep->dd_data;
qedi = qedi_ep->qedi;
 
+   if (qedi_ep->state == EP_STATE_OFLDCONN_START)
+   goto ep_exit_recover;
+
flush_work(&qedi_ep->offload_work);
 
if (qedi_ep->conn) {
-- 
1.8.3.1



[PATCH v2 2/2] qedi: Adjust termination and offload ramrod timers.

2019-04-26 Thread Manish Rangankar
Whenever offload ramrod is issued, firmware wants driver
to wait for max 5 sec, otherwise driver can initiate
further corrective action. Similarly, when termination
ramrod is issued, irrespective of abortive or non-abortive
termination driver should wait for 60 sec * max TCP-RT
timeout.

Signed-off-by: Manish Rangankar 
---
 drivers/scsi/qedi/qedi_iscsi.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/drivers/scsi/qedi/qedi_iscsi.c b/drivers/scsi/qedi/qedi_iscsi.c
index bf371e7..3032bfc 100644
--- a/drivers/scsi/qedi/qedi_iscsi.c
+++ b/drivers/scsi/qedi/qedi_iscsi.c
@@ -993,10 +993,11 @@ static void qedi_ep_disconnect(struct iscsi_endpoint *ep)
struct iscsi_conn *conn = NULL;
struct qedi_ctx *qedi;
int ret = 0;
-   int wait_delay = 20 * HZ;
+   int wait_delay;
int abrt_conn = 0;
int count = 10;
 
+   wait_delay = 60 * HZ + DEF_MAX_RT_TIME;
qedi_ep = ep->dd_data;
qedi = qedi_ep->qedi;
 
@@ -1166,7 +1167,7 @@ static void qedi_offload_work(struct work_struct *work)
struct qedi_endpoint *qedi_ep =
container_of(work, struct qedi_endpoint, offload_work);
struct qedi_ctx *qedi;
-   int wait_delay = 20 * HZ;
+   int wait_delay = 5 * HZ;
int ret;
 
qedi = qedi_ep->qedi;
-- 
1.8.3.1



RE: [EXT] Re: [PATCH 0/2] Ramrod timer and ep state fixes.

2019-04-21 Thread Manish Rangankar

> -Original Message-
> From: Lee Duncan 
> Sent: Friday, April 19, 2019 8:01 PM
> To: Manish Rangankar ;
> martin.peter...@oracle.com; cle...@redhat.com
> Cc: linux-scsi@vger.kernel.org; qlogic-storage-upstr...@cavium.com
> Subject: [EXT] Re: [PATCH 0/2] Ramrod timer and ep state fixes.
> 
> External Email
> 
> --
> Hi Manish:
> 
> On 4/18/19 11:29 PM, Manish Rangankar wrote:
> > Hi Martin,
> >
> > Please apply the following patches to the scsi tree at your earliest
> > convenience.
> >
> > Thanks,
> > Manish
> >
> > Manish Rangankar (2):
> >   qedi: Abort ep termination if offload not scheduled.
> >   qedi: Adjust termination and offload ramrod timers.
> >
> >  drivers/scsi/qedi/qedi_iscsi.c | 8 ++--
> >  1 file changed, 6 insertions(+), 2 deletions(-)
> >
> 
> Both of these patches look fine to me, but I'd like a bit more detail in the
> description, like why you changed the code the way you did.
> 

Sure, will send out the patches with detail description.


[PATCH 0/2] Ramrod timer and ep state fixes.

2019-04-19 Thread Manish Rangankar
Hi Martin,

Please apply the following patches to the scsi tree at your
earliest convenience.

Thanks,
Manish

Manish Rangankar (2):
  qedi: Abort ep termination if offload not scheduled.
  qedi: Adjust termination and offload ramrod timers.

 drivers/scsi/qedi/qedi_iscsi.c | 8 ++--
 1 file changed, 6 insertions(+), 2 deletions(-)

-- 
1.8.3.1



[PATCH 1/2] qedi: Abort ep termination if offload not scheduled.

2019-04-19 Thread Manish Rangankar
kernel: WARNING: CPU: 19 PID: 10110 at kernel/workqueue.c:3030 
__flush_work.isra.34+0x19c/0x1b0
kernel: CPU: 19 PID: 10110 Comm: iscsid Tainted: G W 5.1.0-rc4 #11
kernel: Hardware name: Dell Inc. PowerEdge R730/0599V5, BIOS 2.9.1 12/04/2018
kernel: RIP: 0010:__flush_work.isra.34+0x19c/0x1b0
kernel: Code: 8b fb 66 0f 1f 44 00 00 31 c0 eb ab 48 89 ef c6 07 00 0f 1f 40 00 
fb 66 0f 1f 44 00 00 31 c0 eb 96 e8 08 16 fe ff 0f 0b eb 8d <0f> 0b 31 c0 eb 87 
0f 1f 40 00 66 2e 0f 1
f 84 00 00 00 00 00 0f 1f
kernel: RSP: 0018:a6b4054dba68 EFLAGS: 00010246
kernel: RAX:  RBX: 91df21c36fc0 RCX: 
kernel: RDX: 0001 RSI:  RDI: 91df21c36fc0
kernel: RBP: 91df21c36ef0 R08:  R09: 
kernel: R10: 0038 R11: a6b4054dbd60 R12: c05e72c0
kernel: R13: 91db10280820 R14: 0048 R15: 
kernel: FS:  7f5d83cc1740() GS:91df2f84() 
knlGS:
kernel: CS:  0010 DS:  ES:  CR0: 80050033
kernel: CR2: 01cc5000 CR3: 000465450002 CR4: 001606e0
kernel: Call Trace:
kernel: ? try_to_del_timer_sync+0x4d/0x80
kernel: qedi_ep_disconnect+0x3b/0x410 [qedi]
kernel: ? 0xc083c000
kernel: ? klist_iter_exit+0x14/0x20
kernel: ? class_find_device+0x93/0xf0
kernel: iscsi_if_ep_disconnect.isra.18+0x58/0x70 [scsi_transport_iscsi]
kernel: iscsi_if_recv_msg+0x10e2/0x1510 [scsi_transport_iscsi]
kernel: ? copyout+0x22/0x30
kernel: ? _copy_to_iter+0xa0/0x430
kernel: ? _cond_resched+0x15/0x30
kernel: ? __kmalloc_node_track_caller+0x1f9/0x270
kernel: iscsi_if_rx+0xa5/0x1e0 [scsi_transport_iscsi]
kernel: netlink_unicast+0x17f/0x230
kernel: netlink_sendmsg+0x2d2/0x3d0
kernel: sock_sendmsg+0x36/0x50
kernel: ___sys_sendmsg+0x280/0x2a0
kernel: ? timerqueue_add+0x54/0x80
kernel: ? enqueue_hrtimer+0x38/0x90
kernel: ? hrtimer_start_range_ns+0x19f/0x2c0
kernel: __sys_sendmsg+0x58/0xa0
kernel: do_syscall_64+0x5b/0x180
kernel: entry_SYSCALL_64_after_hwframe+0x44/0xa9

Signed-off-by: Manish Rangankar 
---
 drivers/scsi/qedi/qedi_iscsi.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/drivers/scsi/qedi/qedi_iscsi.c b/drivers/scsi/qedi/qedi_iscsi.c
index 6d6d601..bf371e7 100644
--- a/drivers/scsi/qedi/qedi_iscsi.c
+++ b/drivers/scsi/qedi/qedi_iscsi.c
@@ -1000,6 +1000,9 @@ static void qedi_ep_disconnect(struct iscsi_endpoint *ep)
qedi_ep = ep->dd_data;
qedi = qedi_ep->qedi;
 
+   if (qedi_ep->state == EP_STATE_OFLDCONN_START)
+   goto ep_exit_recover;
+
flush_work(&qedi_ep->offload_work);
 
if (qedi_ep->conn) {
-- 
1.8.3.1



[PATCH 2/2] qedi: Adjust termination and offload ramrod timers.

2019-04-19 Thread Manish Rangankar
Signed-off-by: Manish Rangankar 
---
 drivers/scsi/qedi/qedi_iscsi.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/drivers/scsi/qedi/qedi_iscsi.c b/drivers/scsi/qedi/qedi_iscsi.c
index bf371e7..3032bfc 100644
--- a/drivers/scsi/qedi/qedi_iscsi.c
+++ b/drivers/scsi/qedi/qedi_iscsi.c
@@ -993,10 +993,11 @@ static void qedi_ep_disconnect(struct iscsi_endpoint *ep)
struct iscsi_conn *conn = NULL;
struct qedi_ctx *qedi;
int ret = 0;
-   int wait_delay = 20 * HZ;
+   int wait_delay;
int abrt_conn = 0;
int count = 10;
 
+   wait_delay = 60 * HZ + DEF_MAX_RT_TIME;
qedi_ep = ep->dd_data;
qedi = qedi_ep->qedi;
 
@@ -1166,7 +1167,7 @@ static void qedi_offload_work(struct work_struct *work)
struct qedi_endpoint *qedi_ep =
container_of(work, struct qedi_endpoint, offload_work);
struct qedi_ctx *qedi;
-   int wait_delay = 20 * HZ;
+   int wait_delay = 5 * HZ;
int ret;
 
qedi = qedi_ep->qedi;
-- 
1.8.3.1



RE: [PATCH] scsi: qedi: fix spelling mistake "oflload" -> "offload"

2019-04-17 Thread Manish Rangankar

> -Original Message-
> From: Colin King 
> Sent: Wednesday, April 17, 2019 7:13 PM
> To: qlogic-storage-upstr...@cavium.com; James E . J . Bottomley
> ; Martin K . Petersen ;
> linux-scsi@vger.kernel.org
> Cc: kernel-janit...@vger.kernel.org; linux-ker...@vger.kernel.org
> Subject: [PATCH] scsi: qedi: fix spelling mistake "oflload" -> "offload"
> 
> From: Colin Ian King 
> 
> There are a couple of spelling mistakes in some kernel alert messages.
> Fix these.
> 
> Signed-off-by: Colin Ian King 
> ---
>  drivers/scsi/qedi/qedi_iscsi.c | 4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/scsi/qedi/qedi_iscsi.c b/drivers/scsi/qedi/qedi_iscsi.c
> index 6d6d6013e35b..e4391ee2c27a 100644
> --- a/drivers/scsi/qedi/qedi_iscsi.c
> +++ b/drivers/scsi/qedi/qedi_iscsi.c
> @@ -579,7 +579,7 @@ static int qedi_conn_start(struct iscsi_cls_conn
> *cls_conn)
>   rval = qedi_iscsi_update_conn(qedi, qedi_conn);
>   if (rval) {
>   iscsi_conn_printk(KERN_ALERT, conn,
> -   "conn_start: FW oflload conn failed.\n");
> +   "conn_start: FW offload conn failed.\n");
>   rval = -EINVAL;
>   goto start_err;
>   }
> @@ -590,7 +590,7 @@ static int qedi_conn_start(struct iscsi_cls_conn
> *cls_conn)
>   rval = iscsi_conn_start(cls_conn);
>   if (rval) {
>   iscsi_conn_printk(KERN_ALERT, conn,
> -   "iscsi_conn_start: FW oflload conn
> failed!!\n");
> +   "iscsi_conn_start: FW offload conn
> failed!!\n");
>   }
> 
>  start_err:
> --
> 2.20.1

Thanks,
Acked-by: Manish Rangankar 



RE: [PATCH -next] scsi: qedf: Remove set but not used variable 'fr_len'

2019-04-01 Thread Manish Rangankar


> -Original Message-
> From: linux-scsi-ow...@vger.kernel.org 
> On Behalf Of YueHaibing
> Sent: Saturday, March 30, 2019 7:18 AM
> To: James E . J . Bottomley ; Martin K. Petersen
> 
> Cc: YueHaibing ; QLogic-Storage-
> upstr...@cavium.com; linux-scsi@vger.kernel.org; kernel-
> janit...@vger.kernel.org
> Subject: [PATCH -next] scsi: qedf: Remove set but not used variable 'fr_len'
> 
> Fixes gcc '-Wunused-but-set-variable' warning:
> 
> drivers/scsi/qedf/qedf_fip.c: In function 'qedf_fcoe_send_vlan_req':
> drivers/scsi/qedf/qedf_fip.c:22:6: warning:
>  variable 'fr_len' set but not used [-Wunused-but-set-variable]
> 
> It's never used since introduction and can be removed.
> 
> Signed-off-by: YueHaibing 
> ---
>  drivers/scsi/qedf/qedf_fip.c | 2 --
>  1 file changed, 2 deletions(-)
> 
> diff --git a/drivers/scsi/qedf/qedf_fip.c b/drivers/scsi/qedf/qedf_fip.c index
> 766da74fa546..49d0724535e3 100644
> --- a/drivers/scsi/qedf/qedf_fip.c
> +++ b/drivers/scsi/qedf/qedf_fip.c
> @@ -19,7 +19,6 @@ void qedf_fcoe_send_vlan_req(struct qedf_ctx *qedf)
> {
>   struct sk_buff *skb;
>   char *eth_fr;
> - int fr_len;
>   struct fip_vlan *vlan;
>  #define MY_FIP_ALL_FCF_MACS((__u8[6]) { 1, 0x10, 0x18, 1, 0, 2 })
>   static u8 my_fcoe_all_fcfs[ETH_ALEN] = MY_FIP_ALL_FCF_MACS;
> @@ -29,7 +28,6 @@ void qedf_fcoe_send_vlan_req(struct qedf_ctx *qedf)
>   if (!skb)
>   return;
> 
> - fr_len = sizeof(*vlan);
>   eth_fr = (char *)skb->data;
>   vlan = (struct fip_vlan *)eth_fr;
> 
> 

Thanks,
Acked-by: Manish Rangankar 



RE: [PATCH 6/7] scsi: qlogic: no need to check return value of debugfs_create functions

2019-01-22 Thread Manish Rangankar
> -Original Message-
> From: Greg Kroah-Hartman 
> Sent: Tuesday, January 22, 2019 8:39 PM
> To: James Bottomley ; Martin Petersen
> 
> Cc: linux-ker...@vger.kernel.org; linux-scsi@vger.kernel.org; Greg Kroah-
> Hartman ; QLogic-Storage-
> upstr...@cavium.com
> Subject: [PATCH 6/7] scsi: qlogic: no need to check return value of
> debugfs_create functions
> 
> External Email
> 
> When calling debugfs functions, there is no need to ever check the return
> value.  The function can work or not, but the code logic should never do
> something different based on this.
> 
> Cc: qlogic-storage-upstr...@cavium.com
> Cc: "James E.J. Bottomley" 
> Cc: "Martin K. Petersen" 
> Cc: linux-scsi@vger.kernel.org
> Signed-off-by: Greg Kroah-Hartman 
> ---
>  drivers/scsi/qedf/qedf_debugfs.c | 18 ++
> drivers/scsi/qedi/qedi_debugfs.c | 17 ++---
>  2 files changed, 4 insertions(+), 31 deletions(-)
> 
> diff --git a/drivers/scsi/qedf/qedf_debugfs.c
> b/drivers/scsi/qedf/qedf_debugfs.c
> index c29c162a494f..a32d8ee4666e 100644
> --- a/drivers/scsi/qedf/qedf_debugfs.c
> +++ b/drivers/scsi/qedf/qedf_debugfs.c
> @@ -27,30 +27,19 @@ qedf_dbg_host_init(struct qedf_dbg_ctx *qedf,
> const struct file_operations *fops)  {
> char host_dirname[32];
> -   struct dentry *file_dentry = NULL;
> 
> QEDF_INFO(qedf, QEDF_LOG_DEBUGFS, "Creating debugfs host
> node\n");
> /* create pf dir */
> sprintf(host_dirname, "host%u", qedf->host_no);
> qedf->bdf_dentry = debugfs_create_dir(host_dirname,
> qedf_dbg_root);
> -   if (!qedf->bdf_dentry)
> -   return;
> 
> /* create debugfs files */
> while (dops) {
> if (!(dops->name))
> break;
> 
> -   file_dentry = debugfs_create_file(dops->name, 0600,
> - qedf->bdf_dentry, qedf,
> - fops);
> -   if (!file_dentry) {
> -   QEDF_INFO(qedf, QEDF_LOG_DEBUGFS,
> -  "Debugfs entry %s creation failed\n",
> -  dops->name);
> -   debugfs_remove_recursive(qedf->bdf_dentry);
> -   return;
> -   }
> +   debugfs_create_file(dops->name, 0600, qedf->bdf_dentry, qedf,
> +   fops);
> dops++;
> fops++;
> }
> @@ -80,9 +69,6 @@ qedf_dbg_init(char *drv_name)
> 
> /* create qed dir in root of debugfs. NULL means debugfs root */
> qedf_dbg_root = debugfs_create_dir(drv_name, NULL);
> -   if (!qedf_dbg_root)
> -   QEDF_INFO(NULL, QEDF_LOG_DEBUGFS, "Init of debugfs "
> -  "failed\n");
>  }
> 
>  /**
> diff --git a/drivers/scsi/qedi/qedi_debugfs.c
> b/drivers/scsi/qedi/qedi_debugfs.c
> index fd914ca4149a..5667e4752e2e 100644
> --- a/drivers/scsi/qedi/qedi_debugfs.c
> +++ b/drivers/scsi/qedi/qedi_debugfs.c
> @@ -23,27 +23,16 @@ qedi_dbg_host_init(struct qedi_dbg_ctx *qedi,
>const struct file_operations *fops)  {
> char host_dirname[32];
> -   struct dentry *file_dentry = NULL;
> 
> sprintf(host_dirname, "host%u", qedi->host_no);
> qedi->bdf_dentry = debugfs_create_dir(host_dirname, qedi_dbg_root);
> -   if (!qedi->bdf_dentry)
> -   return;
> 
> while (dops) {
> if (!(dops->name))
> break;
> 
> -   file_dentry = debugfs_create_file(dops->name, 0600,
> - qedi->bdf_dentry, qedi,
> - fops);
> -   if (!file_dentry) {
> -   QEDI_INFO(qedi, QEDI_LOG_DEBUGFS,
> - "Debugfs entry %s creation failed\n",
> - dops->name);
> -   debugfs_remove_recursive(qedi->bdf_dentry);
> -   return;
> -   }
> +   debugfs_create_file(dops->name, 0600, qedi->bdf_dentry, qedi,
> +   fops);
> dops++;
> fops++;
> }
> @@ -60,8 +49,6 @@ void
>  qedi_dbg_init(char *drv_name)
>  {
> qedi_dbg_root = debugfs_create_dir(drv_name, NULL);
> -   if (!qedi_dbg_root)
> -   QEDI_INFO(NULL, QEDI_LOG_DEBUGFS, "Init of debugfs failed\n");
>  }
> 
>  void
> --
> 2.20.1

Thanks
Acked-by: Manish Rangankar 


[PATCH] qedi: Add ep_state for login completion on un-reachable targets.

2019-01-09 Thread Manish Rangankar
When the driver finds invalid destination MAC for the first
un-reachable target, and before completes the PATH_REQ
operation, set new ep_state to OFFLDCONN_NONE so that
as part of driver ep_poll mechanism, the upper open-iscsi
layer is notified to complete the login process on the
first un-reachable target and thus proceed login to other
reachable targets.

Signed-off-by: Manish Rangankar 
---
 drivers/scsi/qedi/qedi_iscsi.c | 3 +++
 drivers/scsi/qedi/qedi_iscsi.h | 1 +
 2 files changed, 4 insertions(+)

diff --git a/drivers/scsi/qedi/qedi_iscsi.c b/drivers/scsi/qedi/qedi_iscsi.c
index 2f0a4f2..d4821b9 100644
--- a/drivers/scsi/qedi/qedi_iscsi.c
+++ b/drivers/scsi/qedi/qedi_iscsi.c
@@ -954,6 +954,7 @@ static int qedi_ep_poll(struct iscsi_endpoint *ep, int 
timeout_ms)
 
qedi_ep = ep->dd_data;
if (qedi_ep->state == EP_STATE_IDLE ||
+   qedi_ep->state == EP_STATE_OFLDCONN_NONE ||
qedi_ep->state == EP_STATE_OFLDCONN_FAILED)
return -1;
 
@@ -1036,6 +1037,7 @@ static void qedi_ep_disconnect(struct iscsi_endpoint *ep)
 
switch (qedi_ep->state) {
case EP_STATE_OFLDCONN_START:
+   case EP_STATE_OFLDCONN_NONE:
goto ep_release_conn;
case EP_STATE_OFLDCONN_FAILED:
break;
@@ -1226,6 +1228,7 @@ static int qedi_set_path(struct Scsi_Host *shost, struct 
iscsi_path *path_data)
 
if (!is_valid_ether_addr(&path_data->mac_addr[0])) {
QEDI_NOTICE(&qedi->dbg_ctx, "dst mac NOT VALID\n");
+   qedi_ep->state = EP_STATE_OFLDCONN_NONE;
ret = -EIO;
goto set_path_exit;
}
diff --git a/drivers/scsi/qedi/qedi_iscsi.h b/drivers/scsi/qedi/qedi_iscsi.h
index 1126077..892d70d 100644
--- a/drivers/scsi/qedi/qedi_iscsi.h
+++ b/drivers/scsi/qedi/qedi_iscsi.h
@@ -59,6 +59,7 @@ enum {
EP_STATE_OFLDCONN_FAILED= 0x2000,
EP_STATE_CONNECT_FAILED = 0x4000,
EP_STATE_DISCONN_TIMEDOUT   = 0x8000,
+   EP_STATE_OFLDCONN_NONE  = 0x1,
 };
 
 struct qedi_conn;
-- 
1.8.3.1



RE: [EXT] [PATCH] scsi: bnx2i: fix indentation issue, remove a tab

2019-01-07 Thread Manish Rangankar
> -Original Message-
> From: Colin King 
> Sent: Friday, January 4, 2019 10:32 PM
> To: qlogic-storage-upstr...@qlogic.com; James E . J . Bottomley
> ; Martin K . Petersen ;
> linux-scsi@vger.kernel.org
> Cc: kernel-janit...@vger.kernel.org; linux-ker...@vger.kernel.org
> Subject: [EXT] [PATCH] scsi: bnx2i: fix indentation issue, remove a tab
> 
> External Email
> 
> --
> External Email
> 
> From: Colin Ian King 
> 
> The return statement is indented incorrectly, fix this by removing a single 
> tab.
> 
> Signed-off-by: Colin Ian King 
> ---
>  drivers/scsi/bnx2i/bnx2i_iscsi.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/drivers/scsi/bnx2i/bnx2i_iscsi.c 
> b/drivers/scsi/bnx2i/bnx2i_iscsi.c
> index 69c75426c5eb..c5fa5f3b00e9 100644
> --- a/drivers/scsi/bnx2i/bnx2i_iscsi.c
> +++ b/drivers/scsi/bnx2i/bnx2i_iscsi.c
> @@ -577,7 +577,7 @@ static void bnx2i_free_mp_bdt(struct bnx2i_hba *hba)
>   hba->dummy_buffer, hba->dummy_buf_dma);
> hba->dummy_buffer = NULL;
> }
> -   return;
> +   return;
>  }
> 
>  /**
> --
> 2.19.1

Thanks
Acked-by: Manish Rangankar 



RE: [EXT] [PATCH -next] scsi: qla4xxx: check return code of qla4xxx_copy_from_fwddb_param

2018-12-24 Thread Manish Rangankar


> -Original Message-
> From: YueHaibing 
> Sent: Thursday, December 20, 2018 8:46 AM
> To: qlogic-storage-upstr...@qlogic.com; j...@linux.ibm.com;
> martin.peter...@oracle.com
> Cc: linux-ker...@vger.kernel.org; linux-scsi@vger.kernel.org; YueHaibing
> 
> Subject: [EXT] [PATCH -next] scsi: qla4xxx: check return code of
> qla4xxx_copy_from_fwddb_param
> 
> External Email
> 
> --
> External Email
> 
> The return code should be check while qla4xxx_copy_from_fwddb_param fails.
> 
> Signed-off-by: YueHaibing 
> ---
>  drivers/scsi/qla4xxx/ql4_os.c | 2 ++
>  1 file changed, 2 insertions(+)
> 
> diff --git a/drivers/scsi/qla4xxx/ql4_os.c b/drivers/scsi/qla4xxx/ql4_os.c 
> index
> 949e186..1bc4db6 100644
> --- a/drivers/scsi/qla4xxx/ql4_os.c
> +++ b/drivers/scsi/qla4xxx/ql4_os.c
> @@ -7232,6 +7232,8 @@ static int qla4xxx_sysfs_ddb_tgt_create(struct
> scsi_qla_host *ha,
> 
> rc = qla4xxx_copy_from_fwddb_param(fnode_sess, fnode_conn,
>fw_ddb_entry);
> +   if (rc)
> +   goto free_sess;
> 
> ql4_printk(KERN_INFO, ha, "%s: sysfs entry %s created\n",
>__func__, fnode_sess->dev.kobj.name);
> --
> 2.7.0
> 

Thanks
Acked-by: Manish Rangankar 



[PATCH] qedi: Send driver state to mfw.

2018-07-03 Thread Manish Rangankar
In case of iSCSI offload BFS environment, mfw requires to mark
virtual link based upon qedi load status.

Signed-off-by: Manish Rangankar 
---
 drivers/scsi/qedi/qedi_main.c | 11 +++
 1 file changed, 11 insertions(+)

diff --git a/drivers/scsi/qedi/qedi_main.c b/drivers/scsi/qedi/qedi_main.c
index 682f3ce..253f305 100644
--- a/drivers/scsi/qedi/qedi_main.c
+++ b/drivers/scsi/qedi/qedi_main.c
@@ -2273,6 +2273,7 @@ static int qedi_setup_boot_info(struct qedi_ctx *qedi)
 static void __qedi_remove(struct pci_dev *pdev, int mode)
 {
struct qedi_ctx *qedi = pci_get_drvdata(pdev);
+   int rval;
 
if (qedi->tmf_thread) {
flush_workqueue(qedi->tmf_thread);
@@ -2302,6 +2303,10 @@ static void __qedi_remove(struct pci_dev *pdev, int mode)
if (mode == QEDI_MODE_NORMAL)
qedi_free_iscsi_pf_param(qedi);
 
+   rval = qedi_ops->common->update_drv_state(qedi->cdev, false);
+   if (rval)
+   QEDI_ERR(&qedi->dbg_ctx, "Failed to send drv state to MFW\n");
+
if (!test_bit(QEDI_IN_OFFLINE, &qedi->flags)) {
qedi_ops->common->slowpath_stop(qedi->cdev);
qedi_ops->common->remove(qedi->cdev);
@@ -2576,6 +2581,12 @@ static int __qedi_probe(struct pci_dev *pdev, int mode)
if (qedi_setup_boot_info(qedi))
QEDI_ERR(&qedi->dbg_ctx,
 "No iSCSI boot target configured\n");
+
+   rc = qedi_ops->common->update_drv_state(qedi->cdev, true);
+   if (rc)
+   QEDI_ERR(&qedi->dbg_ctx,
+"Failed to send drv state to MFW\n");
+
}
 
return 0;
-- 
1.8.3.1



[PATCH] qedi: Fix kernel crash during port toggle.

2018-02-26 Thread Manish Rangankar
BUG: unable to handle kernel NULL pointer dereference at 0100

[  985.596918] IP: _raw_spin_lock_bh+0x17/0x30
[  985.601581] PGD 0 P4D 0
[  985.604405] Oops: 0002 [#1] SMP
:
[  985.704533] CPU: 16 PID: 1156 Comm: qedi_thread/16 Not tainted 4.16.0-rc2 #1
[  985.712397] Hardware name: Dell Inc. PowerEdge R730/0599V5, BIOS 2.4.3 
01/17/2017
[  985.720747] RIP: 0010:_raw_spin_lock_bh+0x17/0x30
[  985.725996] RSP: 0018:a4b1c43d3e10 EFLAGS: 00010246
[  985.731823] RAX:  RBX: 94a31bd03000 RCX: 
[  985.739783] RDX: 0001 RSI: 94a32fa16938 RDI: 0100
[  985.747744] RBP: 0004 R08:  R09: 0a33
[  985.755703] R10:  R11: a4b1c43d3af0 R12: 
[  985.763662] R13: 94a301f40818 R14:  R15: 000c
[  985.771622] FS:  () GS:94a32fa0() 
knlGS:
[  985.780649] CS:  0010 DS:  ES:  CR0: 80050033
[  985.787057] CR2: 0100 CR3: 00067a009006 CR4: 001606e0
[  985.795017] Call Trace:
[  985.797747]  qedi_fp_process_cqes+0x258/0x980 [qedi]
[  985.803294]  qedi_percpu_io_thread+0x10f/0x1b0 [qedi]
[  985.808931]  kthread+0xf5/0x130
[  985.812434]  ? qedi_free_uio+0xd0/0xd0 [qedi]
[  985.817298]  ? kthread_bind+0x10/0x10
[  985.821372]  ? do_syscall_64+0x6e/0x1a0

Signed-off-by: Manish Rangankar 
---
 drivers/scsi/qedi/qedi_fw.c | 5 +
 1 file changed, 5 insertions(+)

diff --git a/drivers/scsi/qedi/qedi_fw.c b/drivers/scsi/qedi/qedi_fw.c
index 667d769..d09afe1 100644
--- a/drivers/scsi/qedi/qedi_fw.c
+++ b/drivers/scsi/qedi/qedi_fw.c
@@ -762,6 +762,11 @@ static void qedi_process_cmd_cleanup_resp(struct qedi_ctx 
*qedi,
 
iscsi_cid = cqe->conn_id;
qedi_conn = qedi->cid_que.conn_cid_tbl[iscsi_cid];
+   if (!qedi_conn) {
+   QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_INFO,
+ "icid not found 0x%x\n", cqe->conn_id);
+   return;
+   }
 
/* Based on this itt get the corresponding qedi_cmd */
spin_lock_bh(&qedi_conn->tmf_work_lock);
-- 
1.8.3.1



[PATCH] qla4xxx: skip error recovery in case of register disconnect.

2018-02-11 Thread Manish Rangankar
A system crashes when continuously removing/re-adding
the storage controller.

Signed-off-by: Manish Rangankar 
---
 drivers/scsi/qla4xxx/ql4_def.h |  2 ++
 drivers/scsi/qla4xxx/ql4_os.c  | 46 ++
 2 files changed, 48 insertions(+)

diff --git a/drivers/scsi/qla4xxx/ql4_def.h b/drivers/scsi/qla4xxx/ql4_def.h
index fc23371..817f312 100644
--- a/drivers/scsi/qla4xxx/ql4_def.h
+++ b/drivers/scsi/qla4xxx/ql4_def.h
@@ -168,6 +168,8 @@
 #define DEV_DB_NON_PERSISTENT  0
 #define DEV_DB_PERSISTENT  1
 
+#define QL4_ISP_REG_DISCONNECT 0xU
+
 #define COPY_ISID(dst_isid, src_isid) {\
int i, j;   \
for (i = 0, j = ISID_SIZE - 1; i < ISID_SIZE;)  \
diff --git a/drivers/scsi/qla4xxx/ql4_os.c b/drivers/scsi/qla4xxx/ql4_os.c
index 2b8a8ce..efaa7f1 100644
--- a/drivers/scsi/qla4xxx/ql4_os.c
+++ b/drivers/scsi/qla4xxx/ql4_os.c
@@ -262,6 +262,24 @@ static int qla4xxx_sysfs_ddb_logout(struct 
iscsi_bus_flash_session *fnode_sess,
 
 static struct scsi_transport_template *qla4xxx_scsi_transport;
 
+static int qla4xxx_isp_check_reg(struct scsi_qla_host *ha)
+{
+   u32 reg_val = 0;
+   int rval = QLA_SUCCESS;
+
+   if (is_qla8022(ha))
+   reg_val = readl(&ha->qla4_82xx_reg->host_status);
+   else if (is_qla8032(ha) || is_qla8042(ha))
+   reg_val = qla4_8xxx_rd_direct(ha, QLA8XXX_PEG_ALIVE_COUNTER);
+   else
+   reg_val = readw(&ha->reg->ctrl_status);
+
+   if (reg_val == QL4_ISP_REG_DISCONNECT)
+   rval = QLA_ERROR;
+
+   return rval;
+}
+
 static int qla4xxx_send_ping(struct Scsi_Host *shost, uint32_t iface_num,
 uint32_t iface_type, uint32_t payload_size,
 uint32_t pid, struct sockaddr *dst_addr)
@@ -9188,10 +9206,17 @@ static int qla4xxx_eh_abort(struct scsi_cmnd *cmd)
struct srb *srb = NULL;
int ret = SUCCESS;
int wait = 0;
+   int rval;
 
ql4_printk(KERN_INFO, ha, "scsi%ld:%d:%llu: Abort command issued 
cmd=%p, cdb=0x%x\n",
   ha->host_no, id, lun, cmd, cmd->cmnd[0]);
 
+   rval = qla4xxx_isp_check_reg(ha);
+   if (rval != QLA_SUCCESS) {
+   ql4_printk(KERN_INFO, ha, "PCI/Register disconnect, 
exiting.\n");
+   return FAILED;
+   }
+
spin_lock_irqsave(&ha->hardware_lock, flags);
srb = (struct srb *) CMD_SP(cmd);
if (!srb) {
@@ -9243,6 +9268,7 @@ static int qla4xxx_eh_device_reset(struct scsi_cmnd *cmd)
struct scsi_qla_host *ha = to_qla_host(cmd->device->host);
struct ddb_entry *ddb_entry = cmd->device->hostdata;
int ret = FAILED, stat;
+   int rval;
 
if (!ddb_entry)
return ret;
@@ -9262,6 +9288,12 @@ static int qla4xxx_eh_device_reset(struct scsi_cmnd *cmd)
  cmd, jiffies, cmd->request->timeout / HZ,
  ha->dpc_flags, cmd->result, cmd->allowed));
 
+   rval = qla4xxx_isp_check_reg(ha);
+   if (rval != QLA_SUCCESS) {
+   ql4_printk(KERN_INFO, ha, "PCI/Register disconnect, 
exiting.\n");
+   return FAILED;
+   }
+
/* FIXME: wait for hba to go online */
stat = qla4xxx_reset_lun(ha, ddb_entry, cmd->device->lun);
if (stat != QLA_SUCCESS) {
@@ -9305,6 +9337,7 @@ static int qla4xxx_eh_target_reset(struct scsi_cmnd *cmd)
struct scsi_qla_host *ha = to_qla_host(cmd->device->host);
struct ddb_entry *ddb_entry = cmd->device->hostdata;
int stat, ret;
+   int rval;
 
if (!ddb_entry)
return FAILED;
@@ -9322,6 +9355,12 @@ static int qla4xxx_eh_target_reset(struct scsi_cmnd *cmd)
  ha->host_no, cmd, jiffies, cmd->request->timeout / HZ,
  ha->dpc_flags, cmd->result, cmd->allowed));
 
+   rval = qla4xxx_isp_check_reg(ha);
+   if (rval != QLA_SUCCESS) {
+   ql4_printk(KERN_INFO, ha, "PCI/Register disconnect, 
exiting.\n");
+   return FAILED;
+   }
+
stat = qla4xxx_reset_target(ha, ddb_entry);
if (stat != QLA_SUCCESS) {
starget_printk(KERN_INFO, scsi_target(cmd->device),
@@ -9376,9 +9415,16 @@ static int qla4xxx_eh_host_reset(struct scsi_cmnd *cmd)
 {
int return_status = FAILED;
struct scsi_qla_host *ha;
+   int rval;
 
ha = to_qla_host(cmd->device->host);
 
+   rval = qla4xxx_isp_check_reg(ha);
+   if (rval != QLA_SUCCESS) {
+   ql4_printk(KERN_INFO, ha, "PCI/Register disconnect, 
exiting.\n");
+   return FAILED;
+   }
+
if ((is_qla8032(ha) || is_qla8042(ha)) && ql4xdontresethba)
qla4_83xx_set_idc_dontreset(ha);
 
-- 
1.8.3.1



[PATCH] qedi: Drop cqe response during connection recovery

2018-01-18 Thread Manish Rangankar
We get stuck in the loop when firmware sends a cqe response
during connection recovery.

Signed-off-by: Manish Rangankar 
---
 drivers/scsi/qedi/qedi_main.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/scsi/qedi/qedi_main.c b/drivers/scsi/qedi/qedi_main.c
index 34a..8808f0d 100644
--- a/drivers/scsi/qedi/qedi_main.c
+++ b/drivers/scsi/qedi/qedi_main.c
@@ -998,7 +998,9 @@ static bool qedi_process_completions(struct qedi_fastpath 
*fp)
 
ret = qedi_queue_cqe(qedi, cqe, fp->sb_id, p);
if (ret)
-   continue;
+   QEDI_WARN(&qedi->dbg_ctx,
+ "Dropping CQE 0x%x for cid=0x%x.\n",
+ que->cq_cons_idx, cqe->cqe_common.conn_id);
 
que->cq_cons_idx++;
if (que->cq_cons_idx == QEDI_CQ_SIZE)
-- 
1.8.3.1



[PATCH] qedi: Limit number for CQ queues.

2017-08-10 Thread Manish Rangankar
[qed_sp_iscsi_func_start:189(host_7-0)]Cannot satisfy CQ amount. Queues
requested 8, CQs available 4. Aborting function start

Above condition will resolve as management firmware is capable of telling
us the number of CQs available for a given PF, qed will communicate the
same number to qedi, So that qedi will know how much CQs are allowed.

Signed-off-by: Manish Rangankar 
---
 drivers/scsi/qedi/qedi.h   |  5 ++---
 drivers/scsi/qedi/qedi_iscsi.c |  2 +-
 drivers/scsi/qedi/qedi_main.c  | 10 +++---
 3 files changed, 10 insertions(+), 7 deletions(-)

diff --git a/drivers/scsi/qedi/qedi.h b/drivers/scsi/qedi/qedi.h
index 91d2f51..b8b22ce 100644
--- a/drivers/scsi/qedi/qedi.h
+++ b/drivers/scsi/qedi/qedi.h
@@ -54,8 +54,8 @@
 /* MAX Length for cached SGL */
 #define MAX_SGLEN_FOR_CACHESGL ((1U << 16) - 1)
 
-#define MAX_NUM_MSIX_PF 8
-#define MIN_NUM_CPUS_MSIX(x)   min((x)->msix_count, num_online_cpus())
+#define MIN_NUM_CPUS_MSIX(x)   min_t(u32, x->dev_info.num_cqs, \
+   num_online_cpus())
 
 #define QEDI_LOCAL_PORT_MIN 6
 #define QEDI_LOCAL_PORT_MAX 61024
@@ -301,7 +301,6 @@ struct qedi_ctx {
u16 bdq_prod_idx;
u16 rq_num_entries;
 
-   u32 msix_count;
u32 max_sqes;
u8 num_queues;
u32 max_active_conns;
diff --git a/drivers/scsi/qedi/qedi_iscsi.c b/drivers/scsi/qedi/qedi_iscsi.c
index 37da9a8..a02b34e 100644
--- a/drivers/scsi/qedi/qedi_iscsi.c
+++ b/drivers/scsi/qedi/qedi_iscsi.c
@@ -534,7 +534,7 @@ static int qedi_iscsi_offload_conn(struct qedi_endpoint 
*qedi_ep)
SET_FIELD(conn_info->tcp_flags, TCP_OFFLOAD_PARAMS_DA_CNT_EN, 1);
SET_FIELD(conn_info->tcp_flags, TCP_OFFLOAD_PARAMS_KA_EN, 1);
 
-   conn_info->default_cq = (qedi_ep->fw_cid % 8);
+   conn_info->default_cq = (qedi_ep->fw_cid % qedi->num_queues);
 
conn_info->ka_max_probe_cnt = DEF_KA_MAX_PROBE_COUNT;
conn_info->dup_ack_theshold = 3;
diff --git a/drivers/scsi/qedi/qedi_main.c b/drivers/scsi/qedi/qedi_main.c
index 2c37836..c4a470b 100644
--- a/drivers/scsi/qedi/qedi_main.c
+++ b/drivers/scsi/qedi/qedi_main.c
@@ -794,13 +794,14 @@ static int qedi_set_iscsi_pf_param(struct qedi_ctx *qedi)
u32 log_page_size;
int rval = 0;
 
-   QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_DISC, "Min number of MSIX %d\n",
- MIN_NUM_CPUS_MSIX(qedi));
 
num_sq_pages = (MAX_OUSTANDING_TASKS_PER_CON * 8) / PAGE_SIZE;
 
qedi->num_queues = MIN_NUM_CPUS_MSIX(qedi);
 
+   QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_INFO,
+ "Number of CQ count is %d\n", qedi->num_queues);
+
memset(&qedi->pf_params.iscsi_pf_params, 0,
   sizeof(qedi->pf_params.iscsi_pf_params));
 
@@ -2179,9 +2180,12 @@ static int __qedi_probe(struct pci_dev *pdev, int mode)
goto free_host;
}
 
-   qedi->msix_count = MAX_NUM_MSIX_PF;
atomic_set(&qedi->link_state, QEDI_LINK_DOWN);
 
+   rc = qedi_ops->fill_dev_info(qedi->cdev, &qedi->dev_info);
+   if (rc)
+   goto free_host;
+
if (mode != QEDI_MODE_RECOVERY) {
rc = qedi_set_iscsi_pf_param(qedi);
if (rc) {
-- 
1.8.3.1



[PATCH 2/2] qedi: Remove WARN_ON from clear task context.

2017-06-15 Thread Manish Rangankar
Signed-off-by: Manish Rangankar 
---
 drivers/scsi/qedi/qedi_main.c | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/drivers/scsi/qedi/qedi_main.c b/drivers/scsi/qedi/qedi_main.c
index 09a2946..879d3b7 100644
--- a/drivers/scsi/qedi/qedi_main.c
+++ b/drivers/scsi/qedi/qedi_main.c
@@ -1499,11 +1499,9 @@ int qedi_get_task_idx(struct qedi_ctx *qedi)
 
 void qedi_clear_task_idx(struct qedi_ctx *qedi, int idx)
 {
-   if (!test_and_clear_bit(idx, qedi->task_idx_map)) {
+   if (!test_and_clear_bit(idx, qedi->task_idx_map))
QEDI_ERR(&qedi->dbg_ctx,
 "FW task context, already cleared, tid=0x%x\n", idx);
-   WARN_ON(1);
-   }
 }
 
 void qedi_update_itt_map(struct qedi_ctx *qedi, u32 tid, u32 proto_itt,
-- 
1.8.3.1



[PATCH 0/2] qedi: Remove unwanted warnings.

2017-06-15 Thread Manish Rangankar
Martin,

Please consider below patches for next 'scsi-fixes' submission.

Thanks,
Manish

Manish Rangankar (2):
  qedi: Remove WARN_ON for untracked cleanup.
  qedi: Remove WARN_ON from clear task context.

 drivers/scsi/qedi/qedi_fw.c   | 1 -
 drivers/scsi/qedi/qedi_main.c | 4 +---
 2 files changed, 1 insertion(+), 4 deletions(-)

-- 
1.8.3.1



[PATCH 1/2] qedi: Remove WARN_ON for untracked cleanup.

2017-06-15 Thread Manish Rangankar
Signed-off-by: Manish Rangankar 
---
 drivers/scsi/qedi/qedi_fw.c | 1 -
 1 file changed, 1 deletion(-)

diff --git a/drivers/scsi/qedi/qedi_fw.c b/drivers/scsi/qedi/qedi_fw.c
index 8bc7ee1..507512c 100644
--- a/drivers/scsi/qedi/qedi_fw.c
+++ b/drivers/scsi/qedi/qedi_fw.c
@@ -870,7 +870,6 @@ static void qedi_process_cmd_cleanup_resp(struct qedi_ctx 
*qedi,
QEDI_ERR(&qedi->dbg_ctx,
 "Delayed or untracked cleanup response, itt=0x%x, 
tid=0x%x, cid=0x%x, task=%p\n",
 protoitt, cqe->itid, qedi_conn->iscsi_conn_id, task);
-   WARN_ON(1);
}
 }
 
-- 
1.8.3.1



[PATCH 0/7]qedi: Bug fixes.

2017-05-19 Thread Manish Rangankar
Martin,

Please apply this patch set to next 'scsi-fixes' series.

Thanks,
Manish

Arun Easi (1):
  qedi: Fix bad pte call trace when iscsiuio is stopped.

Manish Rangankar (5):
  qedi: Correctly set firmware max supported BDs.
  qedi: Set dma_boundary to 0xfff.
  qedi: Fix endpoint NULL panic in qedi_set_path.
  qedi: Set firmware tcp msl timer value.
  qedi: Fix endpoint NULL panic during recovery.

Nilesh Javali (1):
  qedi: set max_fin_rt default value

 drivers/scsi/qedi/qedi.h   |  3 ++-
 drivers/scsi/qedi/qedi_fw.c|  2 ++
 drivers/scsi/qedi/qedi_iscsi.c |  7 ++-
 drivers/scsi/qedi/qedi_main.c  | 25 +
 4 files changed, 23 insertions(+), 14 deletions(-)

-- 
1.8.3.1



[PATCH 3/7] qedi: Set dma_boundary to 0xfff.

2017-05-19 Thread Manish Rangankar
Signed-off-by: Manish Rangankar 
---
 drivers/scsi/qedi/qedi.h   | 1 +
 drivers/scsi/qedi/qedi_iscsi.c | 1 +
 2 files changed, 2 insertions(+)

diff --git a/drivers/scsi/qedi/qedi.h b/drivers/scsi/qedi/qedi.h
index 269dac6..32632c9 100644
--- a/drivers/scsi/qedi/qedi.h
+++ b/drivers/scsi/qedi/qedi.h
@@ -63,6 +63,7 @@
 #define QEDI_PAGE_MASK (~((QEDI_PAGE_SIZE) - 1))
 
 #define QEDI_PAGE_SIZE 4096
+#define QEDI_HW_DMA_BOUNDARY   0xfff
 #define QEDI_PATH_HANDLE   0xFE000UL
 
 struct qedi_uio_ctrl {
diff --git a/drivers/scsi/qedi/qedi_iscsi.c b/drivers/scsi/qedi/qedi_iscsi.c
index 3548d46..1917793 100644
--- a/drivers/scsi/qedi/qedi_iscsi.c
+++ b/drivers/scsi/qedi/qedi_iscsi.c
@@ -59,6 +59,7 @@ struct scsi_host_template qedi_host_template = {
.this_id = -1,
.sg_tablesize = QEDI_ISCSI_MAX_BDS_PER_CMD,
.max_sectors = 0x,
+   .dma_boundary = QEDI_HW_DMA_BOUNDARY,
.cmd_per_lun = 128,
.use_clustering = ENABLE_CLUSTERING,
.shost_attrs = qedi_shost_attrs,
-- 
1.8.3.1



[PATCH 2/7] qedi: Correctly set firmware max supported BDs.

2017-05-19 Thread Manish Rangankar
Signed-off-by: Manish Rangankar 
---
 drivers/scsi/qedi/qedi.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/scsi/qedi/qedi.h b/drivers/scsi/qedi/qedi.h
index 5ca3e8c..269dac6 100644
--- a/drivers/scsi/qedi/qedi.h
+++ b/drivers/scsi/qedi/qedi.h
@@ -38,7 +38,7 @@
 #define QEDI_MAX_ISCSI_TASK4096
 #define QEDI_MAX_TASK_NUM  0x0FFF
 #define QEDI_MAX_ISCSI_CONNS_PER_HBA   1024
-#define QEDI_ISCSI_MAX_BDS_PER_CMD 256 /* Firmware max BDs is 256 */
+#define QEDI_ISCSI_MAX_BDS_PER_CMD 255 /* Firmware max BDs is 255 */
 #define MAX_OUSTANDING_TASKS_PER_CON   1024
 
 #define QEDI_MAX_BD_LEN0x
-- 
1.8.3.1



[PATCH 6/7] qedi: set max_fin_rt default value

2017-05-19 Thread Manish Rangankar
From: Nilesh Javali 

max_fin_rt is the maximum re-transmission of FIN packets
as part of the termination flow. After reaching this value
the FW will send a single RESET.

Signed-off-by: Nilesh Javali 
Signed-off-by: Manish Rangankar 
---
 drivers/scsi/qedi/qedi_main.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/drivers/scsi/qedi/qedi_main.c b/drivers/scsi/qedi/qedi_main.c
index 62ba0550..09a2946 100644
--- a/drivers/scsi/qedi/qedi_main.c
+++ b/drivers/scsi/qedi/qedi_main.c
@@ -828,6 +828,7 @@ static int qedi_set_iscsi_pf_param(struct qedi_ctx *qedi)
qedi->pf_params.iscsi_pf_params.num_queues = qedi->num_queues;
qedi->pf_params.iscsi_pf_params.debug_mode = qedi_fw_debug;
qedi->pf_params.iscsi_pf_params.two_msl_timer = 4000;
+   qedi->pf_params.iscsi_pf_params.max_fin_rt = 2;
 
for (log_page_size = 0 ; log_page_size < 32 ; log_page_size++) {
if ((1 << log_page_size) == PAGE_SIZE)
-- 
1.8.3.1



[PATCH 7/7] qedi: Fix endpoint NULL panic during recovery.

2017-05-19 Thread Manish Rangankar
Signed-off-by: Manish Rangankar 
---
 drivers/scsi/qedi/qedi_fw.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/drivers/scsi/qedi/qedi_fw.c b/drivers/scsi/qedi/qedi_fw.c
index d6978cb..8bc7ee1 100644
--- a/drivers/scsi/qedi/qedi_fw.c
+++ b/drivers/scsi/qedi/qedi_fw.c
@@ -1494,6 +1494,8 @@ static int qedi_send_iscsi_tmf(struct qedi_conn 
*qedi_conn,
tmf_hdr = (struct iscsi_tm *)mtask->hdr;
qedi_cmd = (struct qedi_cmd *)mtask->dd_data;
ep = qedi_conn->ep;
+   if (!ep)
+   return -ENODEV;
 
tid = qedi_get_task_idx(qedi);
if (tid == -1)
-- 
1.8.3.1



[PATCH 5/7] qedi: Set firmware tcp msl timer value.

2017-05-19 Thread Manish Rangankar
Signed-off-by: Manish Rangankar 
---
 drivers/scsi/qedi/qedi_main.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/drivers/scsi/qedi/qedi_main.c b/drivers/scsi/qedi/qedi_main.c
index 997e305..62ba0550 100644
--- a/drivers/scsi/qedi/qedi_main.c
+++ b/drivers/scsi/qedi/qedi_main.c
@@ -827,6 +827,7 @@ static int qedi_set_iscsi_pf_param(struct qedi_ctx *qedi)
qedi->pf_params.iscsi_pf_params.num_uhq_pages_in_ring = num_sq_pages;
qedi->pf_params.iscsi_pf_params.num_queues = qedi->num_queues;
qedi->pf_params.iscsi_pf_params.debug_mode = qedi_fw_debug;
+   qedi->pf_params.iscsi_pf_params.two_msl_timer = 4000;
 
for (log_page_size = 0 ; log_page_size < 32 ; log_page_size++) {
if ((1 << log_page_size) == PAGE_SIZE)
-- 
1.8.3.1



[PATCH 1/7] qedi: Fix bad pte call trace when iscsiuio is stopped.

2017-05-19 Thread Manish Rangankar
From: Arun Easi 

munmap done by iscsiuio during a stop of the service triggers a "bad
pte" warning sometimes. munmap kernel path goes through the mmapped
pages and has a validation check for mapcount (in struct page) to be
zero or above. kzalloc, which we had used to allocate udev->ctrl, uses
slab allocations, which re-uses mapcount (union) for other purposes that
can make the mapcount look negative. Avoid all these trouble by invoking
one of the __get_free_pages wrappers to be used instead of kzalloc for
udev->ctrl.

 BUG: Bad page map in process iscsiuio  pte:8000aa624067 pmd:3e6777067
 page:ea0002a98900 count:2 mapcount:-2143289280
 mapping: (null) index:0x8800aa624e00
 page flags: 0x10075d0090(dirty|slab)
 page dumped because: bad pte
 addr:7fcba70a3000 vm_flags:0c0400fb anon_vma: (null)
 mapping:8803edf66e90 index:0

 Call Trace:
 dump_stack+0x19/0x1b
 print_bad_pte+0x1af/0x250
 unmap_page_range+0x7a7/0x8a0
 unmap_single_vma+0x81/0xf0
 unmap_vmas+0x49/0x90
 unmap_region+0xbe/0x140
 ? vma_rb_erase+0x121/0x220
 do_munmap+0x245/0x420
 vm_munmap+0x41/0x60
 SyS_munmap+0x22/0x30
 tracesys+0xdd/0xe2

Signed-off-by: Arun Easi 
Signed-off-by: Manish Rangankar 
---
 drivers/scsi/qedi/qedi_main.c | 23 +++
 1 file changed, 11 insertions(+), 12 deletions(-)

diff --git a/drivers/scsi/qedi/qedi_main.c b/drivers/scsi/qedi/qedi_main.c
index 92775a8..997e305 100644
--- a/drivers/scsi/qedi/qedi_main.c
+++ b/drivers/scsi/qedi/qedi_main.c
@@ -151,6 +151,11 @@ static int qedi_uio_close(struct uio_info *uinfo, struct 
inode *inode)
 
 static void __qedi_free_uio_rings(struct qedi_uio_dev *udev)
 {
+   if (udev->uctrl) {
+   free_page((unsigned long)udev->uctrl);
+   udev->uctrl = NULL;
+   }
+
if (udev->ll2_ring) {
free_page((unsigned long)udev->ll2_ring);
udev->ll2_ring = NULL;
@@ -169,7 +174,6 @@ static void __qedi_free_uio(struct qedi_uio_dev *udev)
__qedi_free_uio_rings(udev);
 
pci_dev_put(udev->pdev);
-   kfree(udev->uctrl);
kfree(udev);
 }
 
@@ -208,6 +212,11 @@ static int __qedi_alloc_uio_rings(struct qedi_uio_dev 
*udev)
if (udev->ll2_ring || udev->ll2_buf)
return rc;
 
+   /* Memory for control area.  */
+   udev->uctrl = (void *)get_zeroed_page(GFP_KERNEL);
+   if (!udev->uctrl)
+   return -ENOMEM;
+
/* Allocating memory for LL2 ring  */
udev->ll2_ring_size = QEDI_PAGE_SIZE;
udev->ll2_ring = (void *)get_zeroed_page(GFP_KERNEL | __GFP_COMP);
@@ -237,7 +246,6 @@ static int __qedi_alloc_uio_rings(struct qedi_uio_dev *udev)
 static int qedi_alloc_uio_rings(struct qedi_ctx *qedi)
 {
struct qedi_uio_dev *udev = NULL;
-   struct qedi_uio_ctrl *uctrl = NULL;
int rc = 0;
 
list_for_each_entry(udev, &qedi_udev_list, list) {
@@ -258,21 +266,14 @@ static int qedi_alloc_uio_rings(struct qedi_ctx *qedi)
goto err_udev;
}
 
-   uctrl = kzalloc(sizeof(*uctrl), GFP_KERNEL);
-   if (!uctrl) {
-   rc = -ENOMEM;
-   goto err_uctrl;
-   }
-
udev->uio_dev = -1;
 
udev->qedi = qedi;
udev->pdev = qedi->pdev;
-   udev->uctrl = uctrl;
 
rc = __qedi_alloc_uio_rings(udev);
if (rc)
-   goto err_uio_rings;
+   goto err_uctrl;
 
list_add(&udev->list, &qedi_udev_list);
 
@@ -283,8 +284,6 @@ static int qedi_alloc_uio_rings(struct qedi_ctx *qedi)
udev->rx_pkt = udev->ll2_buf + LL2_SINGLE_BUF_SIZE;
return 0;
 
- err_uio_rings:
-   kfree(uctrl);
  err_uctrl:
kfree(udev);
  err_udev:
-- 
1.8.3.1



[PATCH 4/7] qedi: Fix endpoint NULL panic in qedi_set_path.

2017-05-19 Thread Manish Rangankar
 RIP: 0010:qedi_set_path+0x114/0x570 [qedi]
 Call Trace:
  [] iscsi_if_recv_msg+0x623/0x14a0
  [] ? rhashtable_lookup_compare+0x36/0x70
  [] iscsi_if_rx+0x8e/0x1f0
  [] netlink_unicast+0xed/0x1b0
  [] netlink_sendmsg+0x330/0x770
  [] sock_sendmsg+0xb0/0xf0
  [] ? __switch_to+0x17b/0x4b0
  [] ? __schedule+0x2d8/0x900
  [] ___sys_sendmsg+0x3a9/0x3c0
  [] ? get_futex_key+0x1c8/0x2b0
  [] ? futex_wake+0x80/0x160

Signed-off-by: Manish Rangankar 
---
 drivers/scsi/qedi/qedi_iscsi.c | 6 +-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/drivers/scsi/qedi/qedi_iscsi.c b/drivers/scsi/qedi/qedi_iscsi.c
index 1917793..87f0af3 100644
--- a/drivers/scsi/qedi/qedi_iscsi.c
+++ b/drivers/scsi/qedi/qedi_iscsi.c
@@ -1224,8 +1224,12 @@ static int qedi_set_path(struct Scsi_Host *shost, struct 
iscsi_path *path_data)
 
iscsi_cid = (u32)path_data->handle;
qedi_ep = qedi->ep_tbl[iscsi_cid];
-   QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_CONN,
+   QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_INFO,
  "iscsi_cid=0x%x, qedi_ep=%p\n", iscsi_cid, qedi_ep);
+   if (!qedi_ep) {
+   ret = -EINVAL;
+   goto set_path_exit;
+   }
 
if (!is_valid_ether_addr(&path_data->mac_addr[0])) {
QEDI_NOTICE(&qedi->dbg_ctx, "dst mac NOT VALID\n");
-- 
1.8.3.1



[PATCH] qedi: Add PCI device-ID for QL41xxx adapters.

2017-03-15 Thread Manish Rangankar
Signed-off-by: Manish Rangankar 
---
 drivers/scsi/qedi/qedi_main.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/drivers/scsi/qedi/qedi_main.c b/drivers/scsi/qedi/qedi_main.c
index 8e3d928..92775a8 100644
--- a/drivers/scsi/qedi/qedi_main.c
+++ b/drivers/scsi/qedi/qedi_main.c
@@ -2007,6 +2007,7 @@ static void qedi_remove(struct pci_dev *pdev)
 
 static struct pci_device_id qedi_pci_tbl[] = {
{ PCI_DEVICE(PCI_VENDOR_ID_QLOGIC, 0x165E) },
+   { PCI_DEVICE(PCI_VENDOR_ID_QLOGIC, 0x8084) },
{ 0 },
 };
 MODULE_DEVICE_TABLE(pci, qedi_pci_tbl);
-- 
1.8.3.1



[PATCH] qedi: Fix memory leak in tmf response processing.

2017-02-24 Thread Manish Rangankar
From: "Dupuis, Chad" 

Signed-off-by: Manish Rangankar 
Signed-off-by: Chad Dupuis 
---
 drivers/scsi/qedi/qedi_fw.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/drivers/scsi/qedi/qedi_fw.c b/drivers/scsi/qedi/qedi_fw.c
index b1d3904..c9f0ef4 100644
--- a/drivers/scsi/qedi/qedi_fw.c
+++ b/drivers/scsi/qedi/qedi_fw.c
@@ -165,10 +165,9 @@ static void qedi_tmf_resp_work(struct work_struct *work)
iscsi_block_session(session->cls_session);
rval = qedi_cleanup_all_io(qedi, qedi_conn, qedi_cmd->task, true);
if (rval) {
-   clear_bit(QEDI_CONN_FW_CLEANUP, &qedi_conn->flags);
qedi_clear_task_idx(qedi, qedi_cmd->task_id);
iscsi_unblock_session(session->cls_session);
-   return;
+   goto exit_tmf_resp;
}
 
iscsi_unblock_session(session->cls_session);
@@ -177,6 +176,8 @@ static void qedi_tmf_resp_work(struct work_struct *work)
spin_lock(&session->back_lock);
__iscsi_complete_pdu(conn, (struct iscsi_hdr *)resp_hdr_ptr, NULL, 0);
spin_unlock(&session->back_lock);
+
+exit_tmf_resp:
kfree(resp_hdr_ptr);
clear_bit(QEDI_CONN_FW_CLEANUP, &qedi_conn->flags);
 }
-- 
1.8.5.6



[PATCH v3 net-next 1/3] qed: Add support for hardware offloaded iSCSI.

2016-12-01 Thread Manish Rangankar
From: Yuval Mintz 

This adds the backbone required for the various HW initalizations
which are necessary for the iSCSI driver (qedi) for QLogic FastLinQ
4 line of adapters - FW notification, resource initializations, etc.

Signed-off-by: Arun Easi 
Signed-off-by: Yuval Mintz 
Reviewed-by: Johannes Thumshirn 
Reviewed-by: Hannes Reinecke 
---
 drivers/net/ethernet/qlogic/Kconfig|3 +
 drivers/net/ethernet/qlogic/qed/Makefile   |1 +
 drivers/net/ethernet/qlogic/qed/qed.h  |7 +-
 drivers/net/ethernet/qlogic/qed/qed_dev.c  |   12 +
 drivers/net/ethernet/qlogic/qed/qed_iscsi.c| 1277 
 drivers/net/ethernet/qlogic/qed/qed_iscsi.h|   52 +
 drivers/net/ethernet/qlogic/qed/qed_ll2.c  |4 +-
 drivers/net/ethernet/qlogic/qed/qed_reg_addr.h |2 +
 drivers/net/ethernet/qlogic/qed/qed_spq.c  |   15 +
 include/linux/qed/qed_if.h |2 +
 include/linux/qed/qed_iscsi_if.h   |  229 +
 11 files changed, 1602 insertions(+), 2 deletions(-)
 create mode 100644 drivers/net/ethernet/qlogic/qed/qed_iscsi.c
 create mode 100644 drivers/net/ethernet/qlogic/qed/qed_iscsi.h
 create mode 100644 include/linux/qed/qed_iscsi_if.h

diff --git a/drivers/net/ethernet/qlogic/Kconfig 
b/drivers/net/ethernet/qlogic/Kconfig
index 32f2a45..3cfd105 100644
--- a/drivers/net/ethernet/qlogic/Kconfig
+++ b/drivers/net/ethernet/qlogic/Kconfig
@@ -110,4 +110,7 @@ config QEDE
 config QED_RDMA
bool
 
+config QED_ISCSI
+   bool
+
 endif # NET_VENDOR_QLOGIC
diff --git a/drivers/net/ethernet/qlogic/qed/Makefile 
b/drivers/net/ethernet/qlogic/qed/Makefile
index 967acf3..597e15c 100644
--- a/drivers/net/ethernet/qlogic/qed/Makefile
+++ b/drivers/net/ethernet/qlogic/qed/Makefile
@@ -6,3 +6,4 @@ qed-y := qed_cxt.o qed_dev.o qed_hw.o qed_init_fw_funcs.o 
qed_init_ops.o \
 qed-$(CONFIG_QED_SRIOV) += qed_sriov.o qed_vf.o
 qed-$(CONFIG_QED_LL2) += qed_ll2.o
 qed-$(CONFIG_QED_RDMA) += qed_roce.o
+qed-$(CONFIG_QED_ISCSI) += qed_iscsi.o
diff --git a/drivers/net/ethernet/qlogic/qed/qed.h 
b/drivers/net/ethernet/qlogic/qed/qed.h
index 50b8a01..15286c1 100644
--- a/drivers/net/ethernet/qlogic/qed/qed.h
+++ b/drivers/net/ethernet/qlogic/qed/qed.h
@@ -35,6 +35,7 @@
 
 #define QED_WFQ_UNIT   100
 
+#define ISCSI_BDQ_ID(_port_id) (_port_id)
 #define QED_WID_SIZE(1024)
 #define QED_PF_DEMS_SIZE(4)
 
@@ -392,6 +393,7 @@ struct qed_hwfn {
boolusing_ll2;
struct qed_ll2_info *p_ll2_info;
struct qed_rdma_info*p_rdma_info;
+   struct qed_iscsi_info   *p_iscsi_info;
struct qed_pf_paramspf_params;
 
bool b_rdma_enabled_in_prs;
@@ -593,6 +595,8 @@ struct qed_dev {
/* Linux specific here */
struct  qede_dev*edev;
struct  pci_dev *pdev;
+   u32 flags;
+#define QED_FLAG_STORAGE_STARTED   (BIT(0))
int msg_enable;
 
struct pci_params   pci_params;
@@ -606,6 +610,7 @@ struct qed_dev {
union {
struct qed_common_cb_ops*common;
struct qed_eth_cb_ops   *eth;
+   struct qed_iscsi_cb_ops *iscsi;
} protocol_ops;
void*ops_cookie;
 
@@ -615,7 +620,7 @@ struct qed_dev {
struct qed_cb_ll2_info  *ll2;
u8  ll2_mac_address[ETH_ALEN];
 #endif
-
+   DECLARE_HASHTABLE(connections, 10);
const struct firmware   *firmware;
 
u32 rdma_max_sge;
diff --git a/drivers/net/ethernet/qlogic/qed/qed_dev.c 
b/drivers/net/ethernet/qlogic/qed/qed_dev.c
index 5be7b8a..e3612be 100644
--- a/drivers/net/ethernet/qlogic/qed/qed_dev.c
+++ b/drivers/net/ethernet/qlogic/qed/qed_dev.c
@@ -29,6 +29,7 @@
 #include "qed_hw.h"
 #include "qed_init_ops.h"
 #include "qed_int.h"
+#include "qed_iscsi.h"
 #include "qed_ll2.h"
 #include "qed_mcp.h"
 #include "qed_reg_addr.h"
@@ -155,6 +156,8 @@ void qed_resc_free(struct qed_dev *cdev)
 #ifdef CONFIG_QED_LL2
qed_ll2_free(p_hwfn, p_hwfn->p_ll2_info);
 #endif
+   if (p_hwfn->hw_info.personality == QED_PCI_ISCSI)
+   qed_iscsi_free(p_hwfn, p_hwfn->p_iscsi_info);
qed_iov_free(p_hwfn);
qed_dmae_info_free(p_hwfn);
qed_dcbx_info_free(p_hwfn, p_hwfn->p_dcbx_info);
@@ -411,6 +414,7 @@ int qed_qm_reconf(struct qed_hwfn *p_hwfn, struct qed_ptt 
*p_ptt)
 
 int qed_resc_alloc(struct qed_dev *cdev)
 {
+   struct qed_iscsi_info *p_iscsi_info;
 #ifdef CONFIG_QED_LL2
struct qed_ll2_info *p_ll2_info;
 #endif
@@ -533,6 +537,12 @@ int qed_resc_alloc(struct qed_dev *cdev)
p_hwfn->p_ll2_info = p_ll2_info;
}
 #endif
+   if (p_hwfn->hw_info.personality == QED_PCI_ISCSI) {
+ 

[PATCH v3 0/3] Add QLogic FastLinQ iSCSI (qedi) driver.

2016-12-01 Thread Manish Rangankar
This series introduces hardware offload iSCSI initiator driver for the
41000 Series Converged Network Adapters (579xx chip) by Qlogic. The overall
driver design includes a common module ('qed') and protocol specific
dependent modules ('qedi' for iSCSI).

This is an open iSCSI driver, modifications to open iSCSI user components
'iscsid', 'iscsiuio', etc. are required for the solution to work. The user
space changes are also in the process of being submitted.

https://groups.google.com/forum/#!forum/open-iscsi

The 'qed' common module, under drivers/net/ethernet/qlogic/qed/, is
enhanced with functionality required for the iSCSI support. This series
is based on:

net tree base: Merge of net and net-next as of 11/29/2016

Changes from RFC v2:

  1. qedi patches are squashed into single patch to prevent krobot
 warning.
  2. Fixed 'hw_p_cpuq' incompatible pointer type. 
  3. Fixed sparse incompatible types in comparison expression. 
  4. Misc fixes with latest 'checkpatch --strict' option.
  5. Remove int_mode option from MODULE_PARAM.
  6. Prefix all MODULE_PARAM params with qedi_*.
  7. Use CONFIG_QED_ISCSI instead of CONFIG_QEDI
  8. Added bad task mem access fix.

Manish Rangankar (1):
  qedi: Add QLogic FastLinQ offload iSCSI driver framework.

Yuval Mintz (2):
  qed: Add support for hardware offloaded iSCSI.
  qed: Add iSCSI out of order packet handling.

 MAINTAINERS|6 +
 drivers/net/ethernet/qlogic/Kconfig|3 +
 drivers/net/ethernet/qlogic/qed/Makefile   |1 +
 drivers/net/ethernet/qlogic/qed/qed.h  |8 +-
 drivers/net/ethernet/qlogic/qed/qed_dev.c  |   22 +
 drivers/net/ethernet/qlogic/qed/qed_iscsi.c| 1277 +
 drivers/net/ethernet/qlogic/qed/qed_iscsi.h|   52 +
 drivers/net/ethernet/qlogic/qed/qed_ll2.c  |  555 +-
 drivers/net/ethernet/qlogic/qed/qed_ll2.h  |9 +
 drivers/net/ethernet/qlogic/qed/qed_ooo.c  |  501 +
 drivers/net/ethernet/qlogic/qed/qed_ooo.h  |  176 ++
 drivers/net/ethernet/qlogic/qed/qed_reg_addr.h |2 +
 drivers/net/ethernet/qlogic/qed/qed_roce.c |1 +
 drivers/net/ethernet/qlogic/qed/qed_spq.c  |   24 +
 drivers/scsi/Kconfig   |1 +
 drivers/scsi/Makefile  |1 +
 drivers/scsi/qedi/Kconfig  |   10 +
 drivers/scsi/qedi/Makefile |5 +
 drivers/scsi/qedi/qedi.h   |  364 
 drivers/scsi/qedi/qedi_dbg.c   |  143 ++
 drivers/scsi/qedi/qedi_dbg.h   |  144 ++
 drivers/scsi/qedi/qedi_debugfs.c   |  244 +++
 drivers/scsi/qedi/qedi_fw.c| 2378 
 drivers/scsi/qedi/qedi_gbl.h   |   73 +
 drivers/scsi/qedi/qedi_hsi.h   |   52 +
 drivers/scsi/qedi/qedi_iscsi.c | 1624 
 drivers/scsi/qedi/qedi_iscsi.h |  232 +++
 drivers/scsi/qedi/qedi_main.c  | 2127 +
 drivers/scsi/qedi/qedi_sysfs.c |   52 +
 drivers/scsi/qedi/qedi_version.h   |   14 +
 include/linux/qed/qed_if.h |2 +
 include/linux/qed/qed_iscsi_if.h   |  229 +++
 32 files changed, 10303 insertions(+), 29 deletions(-)
 create mode 100644 drivers/net/ethernet/qlogic/qed/qed_iscsi.c
 create mode 100644 drivers/net/ethernet/qlogic/qed/qed_iscsi.h
 create mode 100644 drivers/net/ethernet/qlogic/qed/qed_ooo.c
 create mode 100644 drivers/net/ethernet/qlogic/qed/qed_ooo.h
 create mode 100644 drivers/scsi/qedi/Kconfig
 create mode 100644 drivers/scsi/qedi/Makefile
 create mode 100644 drivers/scsi/qedi/qedi.h
 create mode 100644 drivers/scsi/qedi/qedi_dbg.c
 create mode 100644 drivers/scsi/qedi/qedi_dbg.h
 create mode 100644 drivers/scsi/qedi/qedi_debugfs.c
 create mode 100644 drivers/scsi/qedi/qedi_fw.c
 create mode 100644 drivers/scsi/qedi/qedi_gbl.h
 create mode 100644 drivers/scsi/qedi/qedi_hsi.h
 create mode 100644 drivers/scsi/qedi/qedi_iscsi.c
 create mode 100644 drivers/scsi/qedi/qedi_iscsi.h
 create mode 100644 drivers/scsi/qedi/qedi_main.c
 create mode 100644 drivers/scsi/qedi/qedi_sysfs.c
 create mode 100644 drivers/scsi/qedi/qedi_version.h
 create mode 100644 include/linux/qed/qed_iscsi_if.h

-- 
1.8.3.1

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


[PATCH v3 net-next 2/3] qed: Add iSCSI out of order packet handling.

2016-12-01 Thread Manish Rangankar
From: Yuval Mintz 

This patch adds out of order packet handling for hardware offloaded
iSCSI. Out of order packet handling requires driver buffer allocation
and assistance.

Signed-off-by: Arun Easi 
Signed-off-by: Yuval Mintz 
Reviewed-by: Johannes Thumshirn 
Reviewed-by: Hannes Reinecke 
---
 drivers/net/ethernet/qlogic/qed/Makefile   |   2 +-
 drivers/net/ethernet/qlogic/qed/qed.h  |   1 +
 drivers/net/ethernet/qlogic/qed/qed_dev.c  |  14 +-
 drivers/net/ethernet/qlogic/qed/qed_ll2.c  | 551 +++--
 drivers/net/ethernet/qlogic/qed/qed_ll2.h  |   9 +
 drivers/net/ethernet/qlogic/qed/qed_ooo.c  | 501 ++
 drivers/net/ethernet/qlogic/qed/qed_ooo.h  | 176 +
 drivers/net/ethernet/qlogic/qed/qed_roce.c |   1 +
 drivers/net/ethernet/qlogic/qed/qed_spq.c  |   9 +
 9 files changed, 1234 insertions(+), 30 deletions(-)
 create mode 100644 drivers/net/ethernet/qlogic/qed/qed_ooo.c
 create mode 100644 drivers/net/ethernet/qlogic/qed/qed_ooo.h

diff --git a/drivers/net/ethernet/qlogic/qed/Makefile 
b/drivers/net/ethernet/qlogic/qed/Makefile
index 597e15c..729e437 100644
--- a/drivers/net/ethernet/qlogic/qed/Makefile
+++ b/drivers/net/ethernet/qlogic/qed/Makefile
@@ -6,4 +6,4 @@ qed-y := qed_cxt.o qed_dev.o qed_hw.o qed_init_fw_funcs.o 
qed_init_ops.o \
 qed-$(CONFIG_QED_SRIOV) += qed_sriov.o qed_vf.o
 qed-$(CONFIG_QED_LL2) += qed_ll2.o
 qed-$(CONFIG_QED_RDMA) += qed_roce.o
-qed-$(CONFIG_QED_ISCSI) += qed_iscsi.o
+qed-$(CONFIG_QED_ISCSI) += qed_iscsi.o qed_ooo.o
diff --git a/drivers/net/ethernet/qlogic/qed/qed.h 
b/drivers/net/ethernet/qlogic/qed/qed.h
index 15286c1..85c2c6a 100644
--- a/drivers/net/ethernet/qlogic/qed/qed.h
+++ b/drivers/net/ethernet/qlogic/qed/qed.h
@@ -392,6 +392,7 @@ struct qed_hwfn {
/* Protocol related */
boolusing_ll2;
struct qed_ll2_info *p_ll2_info;
+   struct qed_ooo_info *p_ooo_info;
struct qed_rdma_info*p_rdma_info;
struct qed_iscsi_info   *p_iscsi_info;
struct qed_pf_paramspf_params;
diff --git a/drivers/net/ethernet/qlogic/qed/qed_dev.c 
b/drivers/net/ethernet/qlogic/qed/qed_dev.c
index e3612be..896429c 100644
--- a/drivers/net/ethernet/qlogic/qed/qed_dev.c
+++ b/drivers/net/ethernet/qlogic/qed/qed_dev.c
@@ -32,6 +32,7 @@
 #include "qed_iscsi.h"
 #include "qed_ll2.h"
 #include "qed_mcp.h"
+#include "qed_ooo.h"
 #include "qed_reg_addr.h"
 #include "qed_sp.h"
 #include "qed_sriov.h"
@@ -156,8 +157,10 @@ void qed_resc_free(struct qed_dev *cdev)
 #ifdef CONFIG_QED_LL2
qed_ll2_free(p_hwfn, p_hwfn->p_ll2_info);
 #endif
-   if (p_hwfn->hw_info.personality == QED_PCI_ISCSI)
+   if (p_hwfn->hw_info.personality == QED_PCI_ISCSI) {
qed_iscsi_free(p_hwfn, p_hwfn->p_iscsi_info);
+   qed_ooo_free(p_hwfn, p_hwfn->p_ooo_info);
+   }
qed_iov_free(p_hwfn);
qed_dmae_info_free(p_hwfn);
qed_dcbx_info_free(p_hwfn, p_hwfn->p_dcbx_info);
@@ -415,6 +418,7 @@ int qed_qm_reconf(struct qed_hwfn *p_hwfn, struct qed_ptt 
*p_ptt)
 int qed_resc_alloc(struct qed_dev *cdev)
 {
struct qed_iscsi_info *p_iscsi_info;
+   struct qed_ooo_info *p_ooo_info;
 #ifdef CONFIG_QED_LL2
struct qed_ll2_info *p_ll2_info;
 #endif
@@ -542,6 +546,10 @@ int qed_resc_alloc(struct qed_dev *cdev)
if (!p_iscsi_info)
goto alloc_no_mem;
p_hwfn->p_iscsi_info = p_iscsi_info;
+   p_ooo_info = qed_ooo_alloc(p_hwfn);
+   if (!p_ooo_info)
+   goto alloc_no_mem;
+   p_hwfn->p_ooo_info = p_ooo_info;
}
 
/* DMA info initialization */
@@ -596,8 +604,10 @@ void qed_resc_setup(struct qed_dev *cdev)
if (p_hwfn->using_ll2)
qed_ll2_setup(p_hwfn, p_hwfn->p_ll2_info);
 #endif
-   if (p_hwfn->hw_info.personality == QED_PCI_ISCSI)
+   if (p_hwfn->hw_info.personality == QED_PCI_ISCSI) {
qed_iscsi_setup(p_hwfn, p_hwfn->p_iscsi_info);
+   qed_ooo_setup(p_hwfn, p_hwfn->p_ooo_info);
+   }
}
 }
 
diff --git a/drivers/net/ethernet/qlogic/qed/qed_ll2.c 
b/drivers/net/ethernet/qlogic/qed/qed_ll2.c
index 84d7e91..de4e2a2 100644
--- a/drivers/net/ethernet/qlogic/qed/qed_ll2.c
+++ b/drivers/net/ethernet/qlogic/qed/qed_ll2.c
@@ -36,6 +36,7 @@
 #include "qed_int.h"
 #include "qed_ll2.h"
 #include "qed_mcp.h"
+#include "qed_ooo.h"
 #include "qed_reg_addr.h"
 #include "qed_sp.h"
 #include "qed_roce.h"
@@ -296,25 +297,34 @@ static void qed_ll2_txq_flush(struct qed_hwfn *p_hwfn, u8 
connection_handle)
list_del(&p_pkt->list_entry);
b_last_packet = list_empty(&p_tx->active_descq);

[PATCH v2 0/6] Add QLogic FastLinQ iSCSI (qedi) driver.

2016-11-08 Thread Manish Rangankar
This series introduces hardware offload iSCSI initiator driver for the
41000 Series Converged Network Adapters (579xx chip) by Qlogic. The overall
driver design includes a common module ('qed') and protocol specific
dependent modules ('qedi' for iSCSI).

This is an open iSCSI driver, modifications to open iSCSI user components
'iscsid', 'iscsiuio', etc. are required for the solution to work. The user
space changes are also in the process of being submitted.

https://groups.google.com/forum/#!forum/open-iscsi

The 'qed' common module, under drivers/net/ethernet/qlogic/qed/, is
enhanced with functionality required for the iSCSI support. This series
is based on:

net tree base: Merge of net and net-next as of 10/31/2016

Changes from RFC v1:

 RFC v1 comments reference:

  http://marc.info/?l=linux-scsi&w=2&r=1&s=qed&q=b

 The following comments were incorporated:-

  1. MAC copying to use unaligned macro in qed_sp_iscsi_conn_offload()
  2. Contain scattered IS_ENABLED() check inside header file.
  3. Reduce indent in qed_iscsi_start() by changing logic slightly.
  4. Use kernel-doc style documentation.
  5. Shorten qed_ll2_lb_rxq_completion() by removing queue handling as
 a separate function.
  6. Reduce code duplication by creating qed_ooo_submit_[tr]x_buffers().
  7. Remove dynamic memory allocation in ISR for solicited packets. 
  8. Rearrange qedi_process_iscsi_error() code to use mapping values
 onto strings.
  9. Use kernel-doc style documentation in qedi_hsi.h
  10. Change pr_crit to pr_err. 
  11. Remove unnecessary typecasting. 
  12. Change kmalloc to kmalloc_array in qedi_setup_cid_que(). 
  13. Rearrange firmware and driver version information print. 
  14. Change variable names from scsi_lun to other, as scsi_lun struct exists.
  15. Introduce QEDI_U64_HI and QEDI_U64_LO macros for code readability. 
  16. Move scsi_dma_unmap above sge_valid in qedi_iscsi_unmap_sg_list(). 
  17. Introduce QEDI_OFLD_WAIT_STATE for code readability.
  18. Add cond_resched() in per_cpu_io_thread to avoid soft-lockups.
  19. Change trace_io to accomodate all the scsi commands. 
  20. Spell correction in comments section.

 The following comments were not incorporated:-
  1. Remove "QLogic qed NIC Driver" comment
 - Applies to drivers/net/ethernet/qlogic/qed/*.[ch]
 - This will be submitted as a separate patch, as there are multiple
   files (files that are not part of this series) need to be updated
   and this change is not related to this series.
  2. Update copyright
 - Applies to drivers/net/ethernet/qlogic/qed/*.[ch]
 - Same as above, will submit a separate patch, as multiple files
   need to be updated and this change is not related to this series.
  3. Remove adding and removing of QEDI Kconfig entries. Added by
 "qed" patch and removed and re-added by "qedi" patch.
 - QEDI driver is composed of two parts, the common module (qed) and
   the protocol module (qedi), which goes in net and scsi trees
   respectively. The qed module conditionally enables certain
   functionality for the QEDI module in qed; hence the Kconfig entry was
   added for QEDI by qed; otherwise it looks odd to use CONFIG_QEDI
   in qed. So, the remove and re-add is left as is.
  4. Workqueue implementation in completion path.
 - This change will be submitted as a separate patch, as it requires 
   complete performance validation cycle.
  5. IRQ handling changes from Christoph H. irq work. 
 - This change will also be subitted as a separate patch, as it also
   require change in qed.ko module which will affect other protocol
   drivers (qedr, qede) as well.
 - This change will be integral part of MQ/MQ-TAG infrastructure that
   we want to employ in our qedi driver. 
  6. Using multiple memory barriers.
 - We kept both memory barriers as a failsafe, as for some architectures
   the call is the same but on others they are two different assembly
   operations. We have updated patch with same information in comments.


Manish Rangankar (4):
  qedi: Add QLogic FastLinQ offload iSCSI driver framework.
  qedi: Add LL2 iSCSI interface for offload iSCSI.
  qedi: Add support for iSCSI session management.
  qedi: Add support for data path.

Yuval Mintz (2):
  qed: Add support for hardware offloaded iSCSI.
  qed: Add iSCSI out of order packet handling.

 MAINTAINERS|6 +
 drivers/net/ethernet/qlogic/Kconfig|   15 +
 drivers/net/ethernet/qlogic/qed/Makefile   |1 +
 drivers/net/ethernet/qlogic/qed/qed.h  |8 +-
 drivers/net/ethernet/qlogic/qed/qed_dev.c  |   22 +
 drivers/net/ethernet/qlogic/qed/qed_int.h  |1 -
 drivers/net/ethernet/qlogic/qed/qed_iscsi.c| 1276 +
 drivers/net/ethernet/qlogic/qed/qed_iscsi.h|   52 +
 drivers/net/ethernet/qlogic/q

[PATCH v2 2/6] qed: Add iSCSI out of order packet handling.

2016-11-08 Thread Manish Rangankar
From: Yuval Mintz 

This patch adds out of order packet handling for hardware offloaded
iSCSI. Out of order packet handling requires driver buffer allocation
and assistance.

Signed-off-by: Arun Easi 
Signed-off-by: Yuval Mintz 
---
 drivers/net/ethernet/qlogic/qed/Makefile   |   2 +-
 drivers/net/ethernet/qlogic/qed/qed.h  |   1 +
 drivers/net/ethernet/qlogic/qed/qed_dev.c  |  14 +-
 drivers/net/ethernet/qlogic/qed/qed_ll2.c  | 503 -
 drivers/net/ethernet/qlogic/qed/qed_ll2.h  |   9 +
 drivers/net/ethernet/qlogic/qed/qed_ooo.c  | 501 
 drivers/net/ethernet/qlogic/qed/qed_ooo.h  | 173 ++
 drivers/net/ethernet/qlogic/qed/qed_roce.c |   1 +
 drivers/net/ethernet/qlogic/qed/qed_spq.c  |   9 +
 9 files changed, 1201 insertions(+), 12 deletions(-)
 create mode 100644 drivers/net/ethernet/qlogic/qed/qed_ooo.c
 create mode 100644 drivers/net/ethernet/qlogic/qed/qed_ooo.h

diff --git a/drivers/net/ethernet/qlogic/qed/Makefile 
b/drivers/net/ethernet/qlogic/qed/Makefile
index 597e15c..729e437 100644
--- a/drivers/net/ethernet/qlogic/qed/Makefile
+++ b/drivers/net/ethernet/qlogic/qed/Makefile
@@ -6,4 +6,4 @@ qed-y := qed_cxt.o qed_dev.o qed_hw.o qed_init_fw_funcs.o 
qed_init_ops.o \
 qed-$(CONFIG_QED_SRIOV) += qed_sriov.o qed_vf.o
 qed-$(CONFIG_QED_LL2) += qed_ll2.o
 qed-$(CONFIG_QED_RDMA) += qed_roce.o
-qed-$(CONFIG_QED_ISCSI) += qed_iscsi.o
+qed-$(CONFIG_QED_ISCSI) += qed_iscsi.o qed_ooo.o
diff --git a/drivers/net/ethernet/qlogic/qed/qed.h 
b/drivers/net/ethernet/qlogic/qed/qed.h
index 15286c1..85c2c6a 100644
--- a/drivers/net/ethernet/qlogic/qed/qed.h
+++ b/drivers/net/ethernet/qlogic/qed/qed.h
@@ -392,6 +392,7 @@ struct qed_hwfn {
/* Protocol related */
boolusing_ll2;
struct qed_ll2_info *p_ll2_info;
+   struct qed_ooo_info *p_ooo_info;
struct qed_rdma_info*p_rdma_info;
struct qed_iscsi_info   *p_iscsi_info;
struct qed_pf_paramspf_params;
diff --git a/drivers/net/ethernet/qlogic/qed/qed_dev.c 
b/drivers/net/ethernet/qlogic/qed/qed_dev.c
index e3612be..896429c 100644
--- a/drivers/net/ethernet/qlogic/qed/qed_dev.c
+++ b/drivers/net/ethernet/qlogic/qed/qed_dev.c
@@ -32,6 +32,7 @@
 #include "qed_iscsi.h"
 #include "qed_ll2.h"
 #include "qed_mcp.h"
+#include "qed_ooo.h"
 #include "qed_reg_addr.h"
 #include "qed_sp.h"
 #include "qed_sriov.h"
@@ -156,8 +157,10 @@ void qed_resc_free(struct qed_dev *cdev)
 #ifdef CONFIG_QED_LL2
qed_ll2_free(p_hwfn, p_hwfn->p_ll2_info);
 #endif
-   if (p_hwfn->hw_info.personality == QED_PCI_ISCSI)
+   if (p_hwfn->hw_info.personality == QED_PCI_ISCSI) {
qed_iscsi_free(p_hwfn, p_hwfn->p_iscsi_info);
+   qed_ooo_free(p_hwfn, p_hwfn->p_ooo_info);
+   }
qed_iov_free(p_hwfn);
qed_dmae_info_free(p_hwfn);
qed_dcbx_info_free(p_hwfn, p_hwfn->p_dcbx_info);
@@ -415,6 +418,7 @@ int qed_qm_reconf(struct qed_hwfn *p_hwfn, struct qed_ptt 
*p_ptt)
 int qed_resc_alloc(struct qed_dev *cdev)
 {
struct qed_iscsi_info *p_iscsi_info;
+   struct qed_ooo_info *p_ooo_info;
 #ifdef CONFIG_QED_LL2
struct qed_ll2_info *p_ll2_info;
 #endif
@@ -542,6 +546,10 @@ int qed_resc_alloc(struct qed_dev *cdev)
if (!p_iscsi_info)
goto alloc_no_mem;
p_hwfn->p_iscsi_info = p_iscsi_info;
+   p_ooo_info = qed_ooo_alloc(p_hwfn);
+   if (!p_ooo_info)
+   goto alloc_no_mem;
+   p_hwfn->p_ooo_info = p_ooo_info;
}
 
/* DMA info initialization */
@@ -596,8 +604,10 @@ void qed_resc_setup(struct qed_dev *cdev)
if (p_hwfn->using_ll2)
qed_ll2_setup(p_hwfn, p_hwfn->p_ll2_info);
 #endif
-   if (p_hwfn->hw_info.personality == QED_PCI_ISCSI)
+   if (p_hwfn->hw_info.personality == QED_PCI_ISCSI) {
qed_iscsi_setup(p_hwfn, p_hwfn->p_iscsi_info);
+   qed_ooo_setup(p_hwfn, p_hwfn->p_ooo_info);
+   }
}
 }
 
diff --git a/drivers/net/ethernet/qlogic/qed/qed_ll2.c 
b/drivers/net/ethernet/qlogic/qed/qed_ll2.c
index e5da1b2..c7a9bbd 100644
--- a/drivers/net/ethernet/qlogic/qed/qed_ll2.c
+++ b/drivers/net/ethernet/qlogic/qed/qed_ll2.c
@@ -36,6 +36,7 @@
 #include "qed_int.h"
 #include "qed_ll2.h"
 #include "qed_mcp.h"
+#include "qed_ooo.h"
 #include "qed_reg_addr.h"
 #include "qed_sp.h"
 #include "qed_roce.h"
@@ -540,13 +541,455 @@ static void qed_ll2_rxq_flush(struct qed_hwfn *p_hwfn, 
u8 connection_handle)
 
list_move_tail(&p_pkt->list_entry, &p_rx->free_descq);
 
-   rx_buf_addr = p_pkt->rx_buf_addr;
-   cookie = p_pkt->cookie;
+

[PATCH v2 3/6] qedi: Add QLogic FastLinQ offload iSCSI driver framework.

2016-11-08 Thread Manish Rangankar
The QLogic FastLinQ Driver for iSCSI (qedi) is the iSCSI specific module
for 41000 Series Converged Network Adapters by QLogic.

This patch consists of following changes:
  - MAINTAINERS Makefile and Kconfig changes for qedi,
  - PCI driver registration,
  - iSCSI host level initialization,
  - Debugfs and log level infrastructure.

Signed-off-by: Nilesh Javali 
Signed-off-by: Adheer Chandravanshi 
Signed-off-by: Chad Dupuis 
Signed-off-by: Saurav Kashyap 
Signed-off-by: Arun Easi 
Signed-off-by: Manish Rangankar 
---
 MAINTAINERS |6 +
 drivers/net/ethernet/qlogic/Kconfig |   12 -
 drivers/scsi/Kconfig|1 +
 drivers/scsi/Makefile   |1 +
 drivers/scsi/qedi/Kconfig   |   10 +
 drivers/scsi/qedi/Makefile  |5 +
 drivers/scsi/qedi/qedi.h|  291 +++
 drivers/scsi/qedi/qedi_dbg.c|  143 
 drivers/scsi/qedi/qedi_dbg.h|  144 
 drivers/scsi/qedi/qedi_debugfs.c|  244 ++
 drivers/scsi/qedi/qedi_hsi.h|   52 ++
 drivers/scsi/qedi/qedi_main.c   | 1616 +++
 drivers/scsi/qedi/qedi_sysfs.c  |   52 ++
 drivers/scsi/qedi/qedi_version.h|   14 +
 14 files changed, 2579 insertions(+), 12 deletions(-)
 create mode 100644 drivers/scsi/qedi/Kconfig
 create mode 100644 drivers/scsi/qedi/Makefile
 create mode 100644 drivers/scsi/qedi/qedi.h
 create mode 100644 drivers/scsi/qedi/qedi_dbg.c
 create mode 100644 drivers/scsi/qedi/qedi_dbg.h
 create mode 100644 drivers/scsi/qedi/qedi_debugfs.c
 create mode 100644 drivers/scsi/qedi/qedi_hsi.h
 create mode 100644 drivers/scsi/qedi/qedi_main.c
 create mode 100644 drivers/scsi/qedi/qedi_sysfs.c
 create mode 100644 drivers/scsi/qedi/qedi_version.h

diff --git a/MAINTAINERS b/MAINTAINERS
index e5c17a9..04eec14 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -9934,6 +9934,12 @@ F:   drivers/net/ethernet/qlogic/qed/
 F: include/linux/qed/
 F: drivers/net/ethernet/qlogic/qede/
 
+QLOGIC QL41xxx ISCSI DRIVER
+M: qlogic-storage-upstr...@cavium.com
+L: linux-scsi@vger.kernel.org
+S: Supported
+F: drivers/scsi/qedi/
+
 QNX4 FILESYSTEM
 M: Anders Larsen 
 W: http://www.alarsen.net/linux/qnx4fs/
diff --git a/drivers/net/ethernet/qlogic/Kconfig 
b/drivers/net/ethernet/qlogic/Kconfig
index 2832570..3cfd105 100644
--- a/drivers/net/ethernet/qlogic/Kconfig
+++ b/drivers/net/ethernet/qlogic/Kconfig
@@ -113,16 +113,4 @@ config QED_RDMA
 config QED_ISCSI
bool
 
-config QEDI
-   tristate "QLogic QED 25/40/100Gb iSCSI driver"
-   depends on QED
-   select QED_LL2
-   select QED_ISCSI
-   default n
-   ---help---
- This provides a temporary node that allows the compilation
- and logical testing of the hardware offload iSCSI support
- for QLogic QED. This would be replaced by the 'real' option
- once the QEDI driver is added [+relocated].
-
 endif # NET_VENDOR_QLOGIC
diff --git a/drivers/scsi/Kconfig b/drivers/scsi/Kconfig
index 3e2bdb9..5cf03db 100644
--- a/drivers/scsi/Kconfig
+++ b/drivers/scsi/Kconfig
@@ -1254,6 +1254,7 @@ config SCSI_QLOGICPTI
 
 source "drivers/scsi/qla2xxx/Kconfig"
 source "drivers/scsi/qla4xxx/Kconfig"
+source "drivers/scsi/qedi/Kconfig"
 
 config SCSI_LPFC
tristate "Emulex LightPulse Fibre Channel Support"
diff --git a/drivers/scsi/Makefile b/drivers/scsi/Makefile
index 38d938d..da9e312 100644
--- a/drivers/scsi/Makefile
+++ b/drivers/scsi/Makefile
@@ -132,6 +132,7 @@ obj-$(CONFIG_PS3_ROM)   += ps3rom.o
 obj-$(CONFIG_SCSI_CXGB3_ISCSI) += libiscsi.o libiscsi_tcp.o cxgbi/
 obj-$(CONFIG_SCSI_CXGB4_ISCSI) += libiscsi.o libiscsi_tcp.o cxgbi/
 obj-$(CONFIG_SCSI_BNX2_ISCSI)  += libiscsi.o bnx2i/
+obj-$(CONFIG_QEDI)  += libiscsi.o qedi/
 obj-$(CONFIG_BE2ISCSI) += libiscsi.o be2iscsi/
 obj-$(CONFIG_SCSI_ESAS2R)  += esas2r/
 obj-$(CONFIG_SCSI_PMCRAID) += pmcraid.o
diff --git a/drivers/scsi/qedi/Kconfig b/drivers/scsi/qedi/Kconfig
new file mode 100644
index 000..23ca8a2
--- /dev/null
+++ b/drivers/scsi/qedi/Kconfig
@@ -0,0 +1,10 @@
+config QEDI
+   tristate "QLogic QEDI 25/40/100Gb iSCSI Initiator Driver Support"
+   depends on PCI && SCSI
+   depends on QED
+   select SCSI_ISCSI_ATTRS
+   select QED_LL2
+   select QED_ISCSI
+   ---help---
+   This driver supports iSCSI offload for the QLogic FastLinQ
+   41000 Series Converged Network Adapters.
diff --git a/drivers/scsi/qedi/Makefile b/drivers/scsi/qedi/Makefile
new file mode 100644
index 000..2b3e16b
--- /dev/null
+++ b/drivers/scsi/qedi/Makefile
@@ -0,0 +1,5 @@
+obj-$(CONFIG_QEDI) := qedi.o
+qedi-y := qedi_main.o qedi_iscsi.o qedi_fw.o qedi_sysfs.o \
+   qedi_dbg.o
+
+qedi-$(CONFIG_DEBUG_FS) += qedi_debugfs.o
diff --git a/drivers/scsi/qedi/qedi.h b/drivers/scsi/qedi/qedi.h
new file mode 100644
inde

[PATCH v2 4/6] qedi: Add LL2 iSCSI interface for offload iSCSI.

2016-11-08 Thread Manish Rangankar
This patch adds support for iscsiuio interface using Light L2 (LL2) qed
interface.

Signed-off-by: Nilesh Javali 
Signed-off-by: Adheer Chandravanshi 
Signed-off-by: Chad Dupuis 
Signed-off-by: Saurav Kashyap 
Signed-off-by: Arun Easi 
Signed-off-by: Manish Rangankar 
---
 drivers/scsi/qedi/qedi.h  |  73 +
 drivers/scsi/qedi/qedi_main.c | 357 ++
 2 files changed, 430 insertions(+)

diff --git a/drivers/scsi/qedi/qedi.h b/drivers/scsi/qedi/qedi.h
index 92136a3..e00c141 100644
--- a/drivers/scsi/qedi/qedi.h
+++ b/drivers/scsi/qedi/qedi.h
@@ -21,6 +21,7 @@
 #include 
 #include "qedi_dbg.h"
 #include 
+#include 
 #include "qedi_version.h"
 
 #define QEDI_MODULE_NAME   "qedi"
@@ -54,6 +55,78 @@
 #define QEDI_LOCAL_PORT_MAX 61024
 #define QEDI_LOCAL_PORT_RANGE   (QEDI_LOCAL_PORT_MAX - QEDI_LOCAL_PORT_MIN)
 #define QEDI_LOCAL_PORT_INVALID0x
+#define TX_RX_RING 16
+#define RX_RING(TX_RX_RING - 1)
+#define LL2_SINGLE_BUF_SIZE0x400
+#define QEDI_PAGE_SIZE 4096
+#define QEDI_PAGE_ALIGN(addr)  ALIGN(addr, QEDI_PAGE_SIZE)
+#define QEDI_PAGE_MASK (~((QEDI_PAGE_SIZE) - 1))
+
+#define QEDI_PAGE_SIZE 4096
+#define QEDI_PATH_HANDLE   0xFE000UL
+
+struct qedi_uio_ctrl {
+   /* meta data */
+   u32 uio_hsi_version;
+
+   /* user writes */
+   u32 host_tx_prod;
+   u32 host_rx_cons;
+   u32 host_rx_bd_cons;
+   u32 host_tx_pkt_len;
+   u32 host_rx_cons_cnt;
+
+   /* driver writes */
+   u32 hw_tx_cons;
+   u32 hw_rx_prod;
+   u32 hw_rx_bd_prod;
+   u32 hw_rx_prod_cnt;
+
+   /* other */
+   u8 mac_addr[6];
+   u8 reserve[2];
+};
+
+struct qedi_rx_bd {
+   u32 rx_pkt_index;
+   u32 rx_pkt_len;
+   u16 vlan_id;
+};
+
+#define QEDI_RX_DESC_CNT   (QEDI_PAGE_SIZE / sizeof(struct qedi_rx_bd))
+#define QEDI_MAX_RX_DESC_CNT   (QEDI_RX_DESC_CNT - 1)
+#define QEDI_NUM_RX_BD (QEDI_RX_DESC_CNT * 1)
+#define QEDI_MAX_RX_BD (QEDI_NUM_RX_BD - 1)
+
+#define QEDI_NEXT_RX_IDX(x)x) & (QEDI_MAX_RX_DESC_CNT)) == \
+ (QEDI_MAX_RX_DESC_CNT - 1)) ? \
+(x) + 2 : (x) + 1)
+
+struct qedi_uio_dev {
+   struct uio_info qedi_uinfo;
+   u32 uio_dev;
+   struct list_headlist;
+
+   u32 ll2_ring_size;
+   void*ll2_ring;
+
+   u32 ll2_buf_size;
+   void*ll2_buf;
+
+   void*rx_pkt;
+   void*tx_pkt;
+
+   struct qedi_ctx *qedi;
+   struct pci_dev  *pdev;
+   void*uctrl;
+};
+
+/* List to maintain the skb pointers */
+struct skb_work_list {
+   struct list_head list;
+   struct sk_buff *skb;
+   u16 vlan_id;
+};
 
 /* Queue sizes in number of elements */
 #define QEDI_SQ_SIZE   MAX_OUSTANDING_TASKS_PER_CON
diff --git a/drivers/scsi/qedi/qedi_main.c b/drivers/scsi/qedi/qedi_main.c
index 5845dc9..ef309c6 100644
--- a/drivers/scsi/qedi/qedi_main.c
+++ b/drivers/scsi/qedi/qedi_main.c
@@ -45,10 +45,13 @@
 static struct scsi_transport_template *qedi_scsi_transport;
 static struct pci_driver qedi_pci_driver;
 static DEFINE_PER_CPU(struct qedi_percpu_s, qedi_percpu);
+static LIST_HEAD(qedi_udev_list);
 /* Static function declaration */
 static int qedi_alloc_global_queues(struct qedi_ctx *qedi);
 static void qedi_free_global_queues(struct qedi_ctx *qedi);
 static struct qedi_cmd *qedi_get_cmd_from_tid(struct qedi_ctx *qedi, u32 tid);
+static void qedi_reset_uio_rings(struct qedi_uio_dev *udev);
+static void qedi_ll2_free_skbs(struct qedi_ctx *qedi);
 
 static int qedi_iscsi_event_cb(void *context, u8 fw_event_code, void 
*fw_handle)
 {
@@ -113,6 +116,224 @@ static int qedi_iscsi_event_cb(void *context, u8 
fw_event_code, void *fw_handle)
return rval;
 }
 
+static int qedi_uio_open(struct uio_info *uinfo, struct inode *inode)
+{
+   struct qedi_uio_dev *udev = uinfo->priv;
+   struct qedi_ctx *qedi = udev->qedi;
+
+   if (!capable(CAP_NET_ADMIN))
+   return -EPERM;
+
+   if (udev->uio_dev != -1)
+   return -EBUSY;
+
+   rtnl_lock();
+   udev->uio_dev = iminor(inode);
+   qedi_reset_uio_rings(udev);
+   set_bit(UIO_DEV_OPENED, &qedi->flags);
+   rtnl_unlock();
+
+   return 0;
+}
+
+static int qedi_uio_close(struct uio_info *uinfo, struct inode *inode)
+{
+   struct qedi_uio_dev *udev = uinfo->priv;
+   struct qedi_ctx *qedi = udev->qedi;
+
+   udev->uio_dev = -1;
+   clear_bit(UIO_DEV_OPENED, &qedi->flags);
+   qedi_ll2_free_skbs(qedi);
+   return 0;
+}
+
+static void __qedi_free_uio_rings(struct qedi_uio_dev *udev)
+{
+ 

[PATCH v2 1/6] qed: Add support for hardware offloaded iSCSI.

2016-11-08 Thread Manish Rangankar
From: Yuval Mintz 

This adds the backbone required for the various HW initalizations
which are necessary for the iSCSI driver (qedi) for QLogic FastLinQ
4 line of adapters - FW notification, resource initializations, etc.

Signed-off-by: Arun Easi 
Signed-off-by: Yuval Mintz 
---
 drivers/net/ethernet/qlogic/Kconfig|   15 +
 drivers/net/ethernet/qlogic/qed/Makefile   |1 +
 drivers/net/ethernet/qlogic/qed/qed.h  |7 +-
 drivers/net/ethernet/qlogic/qed/qed_dev.c  |   12 +
 drivers/net/ethernet/qlogic/qed/qed_int.h  |1 -
 drivers/net/ethernet/qlogic/qed/qed_iscsi.c| 1276 
 drivers/net/ethernet/qlogic/qed/qed_iscsi.h|   52 +
 drivers/net/ethernet/qlogic/qed/qed_l2.c   |1 -
 drivers/net/ethernet/qlogic/qed/qed_ll2.c  |4 +-
 drivers/net/ethernet/qlogic/qed/qed_reg_addr.h |2 +
 drivers/net/ethernet/qlogic/qed/qed_spq.c  |   15 +
 include/linux/qed/qed_if.h |2 +
 include/linux/qed/qed_iscsi_if.h   |  229 +
 13 files changed, 1613 insertions(+), 4 deletions(-)
 create mode 100644 drivers/net/ethernet/qlogic/qed/qed_iscsi.c
 create mode 100644 drivers/net/ethernet/qlogic/qed/qed_iscsi.h
 create mode 100644 include/linux/qed/qed_iscsi_if.h

diff --git a/drivers/net/ethernet/qlogic/Kconfig 
b/drivers/net/ethernet/qlogic/Kconfig
index 32f2a45..2832570 100644
--- a/drivers/net/ethernet/qlogic/Kconfig
+++ b/drivers/net/ethernet/qlogic/Kconfig
@@ -110,4 +110,19 @@ config QEDE
 config QED_RDMA
bool
 
+config QED_ISCSI
+   bool
+
+config QEDI
+   tristate "QLogic QED 25/40/100Gb iSCSI driver"
+   depends on QED
+   select QED_LL2
+   select QED_ISCSI
+   default n
+   ---help---
+ This provides a temporary node that allows the compilation
+ and logical testing of the hardware offload iSCSI support
+ for QLogic QED. This would be replaced by the 'real' option
+ once the QEDI driver is added [+relocated].
+
 endif # NET_VENDOR_QLOGIC
diff --git a/drivers/net/ethernet/qlogic/qed/Makefile 
b/drivers/net/ethernet/qlogic/qed/Makefile
index 967acf3..597e15c 100644
--- a/drivers/net/ethernet/qlogic/qed/Makefile
+++ b/drivers/net/ethernet/qlogic/qed/Makefile
@@ -6,3 +6,4 @@ qed-y := qed_cxt.o qed_dev.o qed_hw.o qed_init_fw_funcs.o 
qed_init_ops.o \
 qed-$(CONFIG_QED_SRIOV) += qed_sriov.o qed_vf.o
 qed-$(CONFIG_QED_LL2) += qed_ll2.o
 qed-$(CONFIG_QED_RDMA) += qed_roce.o
+qed-$(CONFIG_QED_ISCSI) += qed_iscsi.o
diff --git a/drivers/net/ethernet/qlogic/qed/qed.h 
b/drivers/net/ethernet/qlogic/qed/qed.h
index 50b8a01..15286c1 100644
--- a/drivers/net/ethernet/qlogic/qed/qed.h
+++ b/drivers/net/ethernet/qlogic/qed/qed.h
@@ -35,6 +35,7 @@
 
 #define QED_WFQ_UNIT   100
 
+#define ISCSI_BDQ_ID(_port_id) (_port_id)
 #define QED_WID_SIZE(1024)
 #define QED_PF_DEMS_SIZE(4)
 
@@ -392,6 +393,7 @@ struct qed_hwfn {
boolusing_ll2;
struct qed_ll2_info *p_ll2_info;
struct qed_rdma_info*p_rdma_info;
+   struct qed_iscsi_info   *p_iscsi_info;
struct qed_pf_paramspf_params;
 
bool b_rdma_enabled_in_prs;
@@ -593,6 +595,8 @@ struct qed_dev {
/* Linux specific here */
struct  qede_dev*edev;
struct  pci_dev *pdev;
+   u32 flags;
+#define QED_FLAG_STORAGE_STARTED   (BIT(0))
int msg_enable;
 
struct pci_params   pci_params;
@@ -606,6 +610,7 @@ struct qed_dev {
union {
struct qed_common_cb_ops*common;
struct qed_eth_cb_ops   *eth;
+   struct qed_iscsi_cb_ops *iscsi;
} protocol_ops;
void*ops_cookie;
 
@@ -615,7 +620,7 @@ struct qed_dev {
struct qed_cb_ll2_info  *ll2;
u8  ll2_mac_address[ETH_ALEN];
 #endif
-
+   DECLARE_HASHTABLE(connections, 10);
const struct firmware   *firmware;
 
u32 rdma_max_sge;
diff --git a/drivers/net/ethernet/qlogic/qed/qed_dev.c 
b/drivers/net/ethernet/qlogic/qed/qed_dev.c
index 5be7b8a..e3612be 100644
--- a/drivers/net/ethernet/qlogic/qed/qed_dev.c
+++ b/drivers/net/ethernet/qlogic/qed/qed_dev.c
@@ -29,6 +29,7 @@
 #include "qed_hw.h"
 #include "qed_init_ops.h"
 #include "qed_int.h"
+#include "qed_iscsi.h"
 #include "qed_ll2.h"
 #include "qed_mcp.h"
 #include "qed_reg_addr.h"
@@ -155,6 +156,8 @@ void qed_resc_free(struct qed_dev *cdev)
 #ifdef CONFIG_QED_LL2
qed_ll2_free(p_hwfn, p_hwfn->p_ll2_info);
 #endif
+   if (p_hwfn->hw_info.personality == QED_PCI_ISCSI)
+   qed_iscsi_free(p_hwfn, p_hwfn->p_iscsi_info);
qed_iov_free(p_hwfn);
qed_dmae_info_free(p_hwfn);
qed_dcbx_info_free(p_hwfn, p

[PATCH v2 5/6] qedi: Add support for iSCSI session management.

2016-11-07 Thread Manish Rangankar
This patch adds support for iscsi_transport LLD Login,
Logout, NOP-IN/NOP-OUT, Async, Reject PDU processing
and Firmware async event handling support.

Signed-off-by: Nilesh Javali 
Signed-off-by: Adheer Chandravanshi 
Signed-off-by: Chad Dupuis 
Signed-off-by: Saurav Kashyap 
Signed-off-by: Arun Easi 
Signed-off-by: Manish Rangankar 
---
 drivers/scsi/qedi/qedi_fw.c| 1106 +++
 drivers/scsi/qedi/qedi_gbl.h   |   67 ++
 drivers/scsi/qedi/qedi_iscsi.c | 1611 
 drivers/scsi/qedi/qedi_iscsi.h |  232 ++
 drivers/scsi/qedi/qedi_main.c  |  166 +
 5 files changed, 3182 insertions(+)
 create mode 100644 drivers/scsi/qedi/qedi_fw.c
 create mode 100644 drivers/scsi/qedi/qedi_gbl.h
 create mode 100644 drivers/scsi/qedi/qedi_iscsi.c
 create mode 100644 drivers/scsi/qedi/qedi_iscsi.h

diff --git a/drivers/scsi/qedi/qedi_fw.c b/drivers/scsi/qedi/qedi_fw.c
new file mode 100644
index 000..5ee62a2
--- /dev/null
+++ b/drivers/scsi/qedi/qedi_fw.c
@@ -0,0 +1,1106 @@
+/*
+ * QLogic iSCSI Offload Driver
+ * Copyright (c) 2016 Cavium Inc.
+ *
+ * This software is available under the terms of the GNU General Public License
+ * (GPL) Version 2, available from the file COPYING in the main directory of
+ * this source tree.
+ */
+
+#include 
+#include 
+#include 
+
+#include "qedi.h"
+#include "qedi_iscsi.h"
+#include "qedi_gbl.h"
+
+static int qedi_send_iscsi_tmf(struct qedi_conn *qedi_conn,
+  struct iscsi_task *mtask);
+
+void qedi_iscsi_unmap_sg_list(struct qedi_cmd *cmd)
+{
+   struct scsi_cmnd *sc = cmd->scsi_cmd;
+
+   if (cmd->io_tbl.sge_valid && sc) {
+   cmd->io_tbl.sge_valid = 0;
+   scsi_dma_unmap(sc);
+   }
+}
+
+static void qedi_process_logout_resp(struct qedi_ctx *qedi,
+union iscsi_cqe *cqe,
+struct iscsi_task *task,
+struct qedi_conn *qedi_conn)
+{
+   struct iscsi_conn *conn = qedi_conn->cls_conn->dd_data;
+   struct iscsi_logout_rsp *resp_hdr;
+   struct iscsi_session *session = conn->session;
+   struct iscsi_logout_response_hdr *cqe_logout_response;
+   struct qedi_cmd *cmd;
+
+   cmd = (struct qedi_cmd *)task->dd_data;
+   cqe_logout_response = &cqe->cqe_common.iscsi_hdr.logout_response;
+   spin_lock(&session->back_lock);
+   resp_hdr = (struct iscsi_logout_rsp *)&qedi_conn->gen_pdu.resp_hdr;
+   memset(resp_hdr, 0, sizeof(struct iscsi_hdr));
+   resp_hdr->opcode = cqe_logout_response->opcode;
+   resp_hdr->flags = cqe_logout_response->flags;
+   resp_hdr->hlength = 0;
+
+   resp_hdr->itt = build_itt(cqe->cqe_solicited.itid, conn->session->age);
+   resp_hdr->statsn = cpu_to_be32(cqe_logout_response->stat_sn);
+   resp_hdr->exp_cmdsn = cpu_to_be32(cqe_logout_response->exp_cmd_sn);
+   resp_hdr->max_cmdsn = cpu_to_be32(cqe_logout_response->max_cmd_sn);
+
+   resp_hdr->t2wait = cpu_to_be32(cqe_logout_response->time2wait);
+   resp_hdr->t2retain = cpu_to_be32(cqe_logout_response->time2retain);
+
+   QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_TID,
+ "Freeing tid=0x%x for cid=0x%x\n",
+ cmd->task_id, qedi_conn->iscsi_conn_id);
+
+   if (likely(cmd->io_cmd_in_list)) {
+   cmd->io_cmd_in_list = false;
+   list_del_init(&cmd->io_cmd);
+   qedi_conn->active_cmd_count--;
+   } else {
+   QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_INFO,
+ "Active cmd list node already deleted, tid=0x%x, 
cid=0x%x, io_cmd_node=%p\n",
+ cmd->task_id, qedi_conn->iscsi_conn_id,
+ &cmd->io_cmd);
+   }
+
+   cmd->state = RESPONSE_RECEIVED;
+   qedi_clear_task_idx(qedi, cmd->task_id);
+   __iscsi_complete_pdu(conn, (struct iscsi_hdr *)resp_hdr, NULL, 0);
+
+   spin_unlock(&session->back_lock);
+}
+
+static void qedi_process_text_resp(struct qedi_ctx *qedi,
+  union iscsi_cqe *cqe,
+  struct iscsi_task *task,
+  struct qedi_conn *qedi_conn)
+{
+   struct iscsi_conn *conn = qedi_conn->cls_conn->dd_data;
+   struct iscsi_session *session = conn->session;
+   struct iscsi_task_context *task_ctx;
+   struct iscsi_text_rsp *resp_hdr_ptr;
+   struct iscsi_text_response_hdr *cqe_text_response;
+   struct qedi_cmd *cmd;
+   int pld_len;
+   u32 *tmp;
+
+   cmd = (struct qedi_cmd *)task->dd_data;
+   task_ctx = qedi_get_task_mem(&qedi->tasks, cmd->task_id);
+
+   cqe_text_response = &cq

[PATCH v2 6/6] qedi: Add support for data path.

2016-11-07 Thread Manish Rangankar
This patch adds support for data path and TMF handling.

Signed-off-by: Nilesh Javali 
Signed-off-by: Adheer Chandravanshi 
Signed-off-by: Chad Dupuis 
Signed-off-by: Saurav Kashyap 
Signed-off-by: Arun Easi 
Signed-off-by: Manish Rangankar 
---
 drivers/scsi/qedi/qedi_fw.c| 1272 
 drivers/scsi/qedi/qedi_gbl.h   |6 +
 drivers/scsi/qedi/qedi_iscsi.c |   13 +
 drivers/scsi/qedi/qedi_main.c  |4 +
 4 files changed, 1295 insertions(+)

diff --git a/drivers/scsi/qedi/qedi_fw.c b/drivers/scsi/qedi/qedi_fw.c
index 5ee62a2..560c3e6 100644
--- a/drivers/scsi/qedi/qedi_fw.c
+++ b/drivers/scsi/qedi/qedi_fw.c
@@ -146,6 +146,114 @@ static void qedi_process_text_resp(struct qedi_ctx *qedi,
spin_unlock(&session->back_lock);
 }
 
+static void qedi_tmf_resp_work(struct work_struct *work)
+{
+   struct qedi_cmd *qedi_cmd =
+   container_of(work, struct qedi_cmd, tmf_work);
+   struct qedi_conn *qedi_conn = qedi_cmd->conn;
+   struct qedi_ctx *qedi = qedi_conn->qedi;
+   struct iscsi_conn *conn = qedi_conn->cls_conn->dd_data;
+   struct iscsi_session *session = conn->session;
+   struct iscsi_tm_rsp *resp_hdr_ptr;
+   struct iscsi_cls_session *cls_sess;
+   int rval = 0;
+
+   set_bit(QEDI_CONN_FW_CLEANUP, &qedi_conn->flags);
+   resp_hdr_ptr =  (struct iscsi_tm_rsp *)qedi_cmd->tmf_resp_buf;
+   cls_sess = iscsi_conn_to_session(qedi_conn->cls_conn);
+
+   iscsi_block_session(session->cls_session);
+   rval = qedi_cleanup_all_io(qedi, qedi_conn, qedi_cmd->task, true);
+   if (rval) {
+   clear_bit(QEDI_CONN_FW_CLEANUP, &qedi_conn->flags);
+   qedi_clear_task_idx(qedi, qedi_cmd->task_id);
+   iscsi_unblock_session(session->cls_session);
+   return;
+   }
+
+   iscsi_unblock_session(session->cls_session);
+   qedi_clear_task_idx(qedi, qedi_cmd->task_id);
+
+   spin_lock(&session->back_lock);
+   __iscsi_complete_pdu(conn, (struct iscsi_hdr *)resp_hdr_ptr, NULL, 0);
+   spin_unlock(&session->back_lock);
+   kfree(resp_hdr_ptr);
+   clear_bit(QEDI_CONN_FW_CLEANUP, &qedi_conn->flags);
+}
+
+static void qedi_process_tmf_resp(struct qedi_ctx *qedi,
+ union iscsi_cqe *cqe,
+ struct iscsi_task *task,
+ struct qedi_conn *qedi_conn)
+
+{
+   struct iscsi_conn *conn = qedi_conn->cls_conn->dd_data;
+   struct iscsi_session *session = conn->session;
+   struct iscsi_tmf_response_hdr *cqe_tmp_response;
+   struct iscsi_tm_rsp *resp_hdr_ptr;
+   struct iscsi_tm *tmf_hdr;
+   struct qedi_cmd *qedi_cmd = NULL;
+   u32 *tmp;
+
+   cqe_tmp_response = &cqe->cqe_common.iscsi_hdr.tmf_response;
+
+   qedi_cmd = task->dd_data;
+   qedi_cmd->tmf_resp_buf = kzalloc(sizeof(*resp_hdr_ptr), GFP_KERNEL);
+   if (!qedi_cmd->tmf_resp_buf) {
+   QEDI_ERR(&qedi->dbg_ctx,
+"Failed to allocate resp buf, cid=0x%x\n",
+ qedi_conn->iscsi_conn_id);
+   return;
+   }
+
+   spin_lock(&session->back_lock);
+   resp_hdr_ptr =  (struct iscsi_tm_rsp *)qedi_cmd->tmf_resp_buf;
+   memset(resp_hdr_ptr, 0, sizeof(struct iscsi_tm_rsp));
+
+   /* Fill up the header */
+   resp_hdr_ptr->opcode = cqe_tmp_response->opcode;
+   resp_hdr_ptr->flags = cqe_tmp_response->hdr_flags;
+   resp_hdr_ptr->response = cqe_tmp_response->hdr_response;
+   resp_hdr_ptr->hlength = 0;
+
+   hton24(resp_hdr_ptr->dlength,
+  (cqe_tmp_response->hdr_second_dword &
+   ISCSI_TMF_RESPONSE_HDR_DATA_SEG_LEN_MASK));
+   tmp = (u32 *)resp_hdr_ptr->dlength;
+   resp_hdr_ptr->itt = build_itt(cqe->cqe_solicited.itid,
+ conn->session->age);
+   resp_hdr_ptr->statsn = cpu_to_be32(cqe_tmp_response->stat_sn);
+   resp_hdr_ptr->exp_cmdsn  = cpu_to_be32(cqe_tmp_response->exp_cmd_sn);
+   resp_hdr_ptr->max_cmdsn = cpu_to_be32(cqe_tmp_response->max_cmd_sn);
+
+   tmf_hdr = (struct iscsi_tm *)qedi_cmd->task->hdr;
+
+   if (likely(qedi_cmd->io_cmd_in_list)) {
+   qedi_cmd->io_cmd_in_list = false;
+   list_del_init(&qedi_cmd->io_cmd);
+   qedi_conn->active_cmd_count--;
+   }
+
+   if (((tmf_hdr->flags & ISCSI_FLAG_TM_FUNC_MASK) ==
+ ISCSI_TM_FUNC_LOGICAL_UNIT_RESET) ||
+   ((tmf_hdr->flags & ISCSI_FLAG_TM_FUNC_MASK) ==
+ ISCSI_TM_FUNC_TARGET_WARM_RESET) ||
+   ((tmf_hdr->flags & ISCSI_FLAG_TM_FUNC_MASK) ==
+ ISCSI_TM_FUNC_TARGET_COLD_