[PATCH 1/2] qedi: Check targetname while finding boot target information

2019-06-12 Thread Nilesh Javali
The kernel panic was observed during iSCSI discovery via offload
with below call trace,

[ 2115.646901] BUG: unable to handle kernel NULL pointer dereference at (null)
[ 2115.646909] IP: [] strncmp+0xc/0x60
[ 2115.646927] PGD 0
[ 2115.646932] Oops:  [#1] SMP
[ 2115.647107] CPU: 24 PID: 264 Comm: kworker/24:1 Kdump: loaded Tainted: G
   OE     3.10.0-957.el7.x86_64 #1
[ 2115.647133] Workqueue: slowpath-13:00. qed_slowpath_task [qed]
[ 2115.647135] task: 8d66af80b0c0 ti: 8d66afb8 task.ti: 
8d66afb8
[ 2115.647136] RIP: 0010:[]  [] 
strncmp+0xc/0x60
[ 2115.647141] RSP: 0018:8d66afb83c68  EFLAGS: 00010206
[ 2115.647143] RAX: 0001 RBX: 0007 RCX: 000a
[ 2115.647144] RDX: 0100 RSI:  RDI: 8d632b3ba040
[ 2115.647145] RBP: 8d66afb83c68 R08:  R09: 
[ 2115.647147] R10: 0007 R11: 0800 R12: 8d66a30007a0
[ 2115.647148] R13: 8d66747a3c10 R14: 8d632b3ba000 R15: 8d66747a32f8
[ 2115.647149] FS:  () GS:8d66aff0() 
knlGS:
[ 2115.647151] CS:  0010 DS:  ES:  CR0: 80050033
[ 2115.647152] CR2:  CR3: 00050961 CR4: 007607e0
[ 2115.647153] DR0:  DR1:  DR2: 
[ 2115.647154] DR3:  DR6: fffe0ff0 DR7: 0400
[ 2115.647155] PKRU: 
[ 2115.647157] Call Trace:
[ 2115.647165]  [] qedi_get_protocol_tlv_data+0x2c5/0x510 
[qedi]
[ 2115.647184]  [] ? qed_mfw_process_tlv_req+0x245/0xbe0 [qed]
[ 2115.647195]  [] qed_mfw_fill_tlv_data+0x4b/0xb0 [qed]
[ 2115.647206]  [] qed_mfw_process_tlv_req+0x261/0xbe0 [qed]
[ 2115.647215]  [] ? dequeue_task_fair+0x41e/0x660
[ 2115.647221]  [] ? __switch_to+0xce/0x580
[ 2115.647230]  [] qed_slowpath_task+0xa3/0x160 [qed]
[ 2115.647278] RIP  [] strncmp+0xc/0x60

Fix kernel panic by validating the session targetname before providing
TLV data and confirming the presence of boot targets.

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

diff --git a/drivers/scsi/qedi/qedi_main.c b/drivers/scsi/qedi/qedi_main.c
index 8814bfc..f210a3e 100644
--- a/drivers/scsi/qedi/qedi_main.c
+++ b/drivers/scsi/qedi/qedi_main.c
@@ -987,6 +987,9 @@ static int qedi_find_boot_info(struct qedi_ctx *qedi,
if (!iscsi_is_session_online(cls_sess))
continue;
 
+   if (!sess->targetname)
+   continue;
+
if (pri_ctrl_flags) {
if (!strcmp(pri_tgt->iscsi_name, sess->targetname) &&
!strcmp(pri_tgt->ip_addr, ep_ip_addr)) {
-- 
1.8.3.1



[PATCH 2/2] qedi: update driver version to 8.37.0.20

2019-06-12 Thread Nilesh Javali
Update qedi driver version to 8.37.0.20

Signed-off-by: Nilesh Javali 
---
 drivers/scsi/qedi/qedi_version.h | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/scsi/qedi/qedi_version.h b/drivers/scsi/qedi/qedi_version.h
index f56f0ba..0ac1055 100644
--- a/drivers/scsi/qedi/qedi_version.h
+++ b/drivers/scsi/qedi/qedi_version.h
@@ -4,8 +4,8 @@
  * Copyright (c) 2016 Cavium Inc.
  */
 
-#define QEDI_MODULE_VERSION"8.33.0.21"
+#define QEDI_MODULE_VERSION"8.37.0.20"
 #define QEDI_DRIVER_MAJOR_VER  8
-#define QEDI_DRIVER_MINOR_VER  33
+#define QEDI_DRIVER_MINOR_VER  37
 #define QEDI_DRIVER_REV_VER0
-#define QEDI_DRIVER_ENG_VER21
+#define QEDI_DRIVER_ENG_VER20
-- 
1.8.3.1



[PATCH 0/2] qedi bug fix and update driver version

2019-06-12 Thread Nilesh Javali
Hi Martin,

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

Nilesh Javali (2):
  qedi: Check targetname while finding boot target information
  qedi: update driver version to 8.37.0.20

 drivers/scsi/qedi/qedi_main.c| 3 +++
 drivers/scsi/qedi/qedi_version.h | 6 +++---
 2 files changed, 6 insertions(+), 3 deletions(-)

-- 
1.8.3.1



Re: [PATCH 36/41] scsi: qla4xxx: ql4_os: mark expected switch fall-through

2018-12-24 Thread Nilesh Javali


On 11/28/18, 10:03 AM, "linux-scsi-ow...@vger.kernel.org on behalf of
Gustavo A. R. Silva"  wrote:

>External Email
>
>In preparation to enabling -Wimplicit-fallthrough, mark switch cases
>where we are expecting to fall through.
>
>Notice that, in this particular case, I replaced "allow fall-through"
>with a "fall through" annotation, which is what GCC is expecting to
>find.
>
>Signed-off-by: Gustavo A. R. Silva 
>---
> drivers/scsi/qla4xxx/ql4_os.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
>diff --git a/drivers/scsi/qla4xxx/ql4_os.c b/drivers/scsi/qla4xxx/ql4_os.c
>index 1c702cd22359..7fd3491ea2d9 100644
>--- a/drivers/scsi/qla4xxx/ql4_os.c
>+++ b/drivers/scsi/qla4xxx/ql4_os.c
>@@ -2876,7 +2876,7 @@ static int qla4xxx_session_get_param(struct
>iscsi_cls_session *cls_sess,
>chap_tbl.secret_len);
>}
>}
>-   /* allow fall-through */
>+   /* fall through */
>default:
>        return iscsi_session_get_param(cls_sess, param, buf);
>}
>--
>2.17.1

Thanks.
Acked-by: Nilesh Javali 



[PATCH v2 5/9] qedi: Check for session online before getting iSCSI TLV data.

2018-11-21 Thread Nilesh Javali
From: Manish Rangankar 

The kernel panic was observed after switch side perturbation,

BUG: unable to handle kernel NULL pointer dereference at (null)
 IP: [] strcmp+0x20/0x40
 PGD 0 Oops:  [#1] SMP
CPU: 8 PID: 647 Comm: kworker/8:1 Tainted: GW  OE     
3.10.0-693.el7.x86_64 #1
Hardware name: HPE ProLiant DL380 Gen10/ProLiant DL380 Gen10, BIOS U30 
06/20/2018
Workqueue: slowpath-13:00. qed_slowpath_task [qed]
task: 880429eb8fd0 ti: 88042919 task.ti: 88042919
RIP: 0010:[]  [] strcmp+0x20/0x40
RSP: 0018:880429193c68  EFLAGS: 00010202
RAX: 000a RBX: 0002 RCX: 
RDX: 0001 RSI: 0001 RDI: 88042bda7a41
RBP: 880429193c68 R08:  R09: 
R10: 0007 R11: 88042b3af338 R12: 880420b007a0
R13: 88081aa56af8 R14: 0001 R15: 88081aa50410
FS:  () GS:88042fe0() knlGS:
CS:  0010 DS:  ES:  CR0: 80050033
CR2:  CR3: 019f2000 CR4: 003407e0
DR0:  DR1:  DR2: 
DR3:  DR6: fffe0ff0 DR7: 0400
Stack:
880429193d20 c02a0c90 c90004b32000 8803fd3ec600
88042bda7800 88042bda7a00 88042bda7840 88042bda7a40
000129193d10 2e3836312e323931 ff000a342e363232 c01ad99d
Call Trace:
[] qedi_get_protocol_tlv_data+0x270/0x470 [qedi]
[] ? qed_mfw_process_tlv_req+0x24d/0xbf0 [qed]
[] qed_mfw_fill_tlv_data+0x5e/0xd0 [qed]
[] qed_mfw_process_tlv_req+0x269/0xbf0 [qed]

Fix kernel NULL pointer deref by checking for session is online
before getting iSCSI TLV data.

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

diff --git a/drivers/scsi/qedi/qedi_main.c b/drivers/scsi/qedi/qedi_main.c
index 5308e6b..713db9c 100644
--- a/drivers/scsi/qedi/qedi_main.c
+++ b/drivers/scsi/qedi/qedi_main.c
@@ -952,6 +952,9 @@ static int qedi_find_boot_info(struct qedi_ctx *qedi,
cls_sess = iscsi_conn_to_session(cls_conn);
sess = cls_sess->dd_data;
 
+   if (!iscsi_is_session_online(cls_sess))
+   continue;
+
if (pri_ctrl_flags) {
if (!strcmp(pri_tgt->iscsi_name, sess->targetname) &&
!strcmp(pri_tgt->ip_addr, ep_ip_addr)) {
-- 
1.8.3.1



[PATCH v2 7/9] qedi: add module param to set ping packet size

2018-11-21 Thread Nilesh Javali
Default packet size is 0x400.
For jumbo packets set to 0x2400.

Signed-off-by: Nilesh Javali 
---
 drivers/scsi/qedi/qedi.h  |  1 -
 drivers/scsi/qedi/qedi_main.c | 13 +
 2 files changed, 9 insertions(+), 5 deletions(-)

diff --git a/drivers/scsi/qedi/qedi.h b/drivers/scsi/qedi/qedi.h
index 6fa02c5..a26bb506 100644
--- a/drivers/scsi/qedi/qedi.h
+++ b/drivers/scsi/qedi/qedi.h
@@ -63,7 +63,6 @@
 #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_ALIGN(addr)  ALIGN(addr, QEDI_PAGE_SIZE)
 #define QEDI_PAGE_MASK (~((QEDI_PAGE_SIZE) - 1))
 
diff --git a/drivers/scsi/qedi/qedi_main.c b/drivers/scsi/qedi/qedi_main.c
index 2621dee..8942f62 100644
--- a/drivers/scsi/qedi/qedi_main.c
+++ b/drivers/scsi/qedi/qedi_main.c
@@ -44,6 +44,11 @@
 MODULE_PARM_DESC(qedi_io_tracing,
 " Enable logging of SCSI requests/completions into trace 
buffer. (default off).");
 
+uint qedi_ll2_buf_size = 0x400;
+module_param(qedi_ll2_buf_size, uint, 0644);
+MODULE_PARM_DESC(qedi_ll2_buf_size,
+"parameter to set ping packet size, default - 0x400, Jumbo 
packets - 0x2400.");
+
 const struct qed_iscsi_ops *qedi_ops;
 static struct scsi_transport_template *qedi_scsi_transport;
 static struct pci_driver qedi_pci_driver;
@@ -228,7 +233,7 @@ static int __qedi_alloc_uio_rings(struct qedi_uio_dev *udev)
}
 
/* Allocating memory for Tx/Rx pkt buffer */
-   udev->ll2_buf_size = TX_RX_RING * LL2_SINGLE_BUF_SIZE;
+   udev->ll2_buf_size = TX_RX_RING * qedi_ll2_buf_size;
udev->ll2_buf_size = QEDI_PAGE_ALIGN(udev->ll2_buf_size);
udev->ll2_buf = (void *)__get_free_pages(GFP_KERNEL | __GFP_COMP |
 __GFP_ZERO, 2);
@@ -283,7 +288,7 @@ static int qedi_alloc_uio_rings(struct qedi_ctx *qedi)
qedi->udev = udev;
 
udev->tx_pkt = udev->ll2_buf;
-   udev->rx_pkt = udev->ll2_buf + LL2_SINGLE_BUF_SIZE;
+   udev->rx_pkt = udev->ll2_buf + qedi_ll2_buf_size;
return 0;
 
  err_uctrl:
@@ -752,8 +757,8 @@ static int qedi_ll2_process_skb(struct qedi_ctx *qedi, 
struct sk_buff *skb,
 
udev = qedi->udev;
uctrl = udev->uctrl;
-   pkt = udev->rx_pkt + (uctrl->hw_rx_prod * LL2_SINGLE_BUF_SIZE);
-   len = min_t(u32, skb->len, (u32)LL2_SINGLE_BUF_SIZE);
+   pkt = udev->rx_pkt + (uctrl->hw_rx_prod * qedi_ll2_buf_size);
+   len = min_t(u32, skb->len, (u32)qedi_ll2_buf_size);
memcpy(pkt, skb->data, len);
 
memset(&rxbd, 0, sizeof(rxbd));
-- 
1.8.3.1



[PATCH v2 9/9] qedi: Update driver version to 8.33.0.21

2018-11-21 Thread Nilesh Javali
Signed-off-by: Nilesh Javali 
---
 drivers/scsi/qedi/qedi_version.h | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/scsi/qedi/qedi_version.h b/drivers/scsi/qedi/qedi_version.h
index 8a0e523..41bcbba 100644
--- a/drivers/scsi/qedi/qedi_version.h
+++ b/drivers/scsi/qedi/qedi_version.h
@@ -7,8 +7,8 @@
  * this source tree.
  */
 
-#define QEDI_MODULE_VERSION"8.33.0.20"
+#define QEDI_MODULE_VERSION"8.33.0.21"
 #define QEDI_DRIVER_MAJOR_VER  8
 #define QEDI_DRIVER_MINOR_VER  33
 #define QEDI_DRIVER_REV_VER0
-#define QEDI_DRIVER_ENG_VER20
+#define QEDI_DRIVER_ENG_VER21
-- 
1.8.3.1



[PATCH v2 8/9] qedi: Move LL2 producer index processing in BH.

2018-11-21 Thread Nilesh Javali
From: Manish Rangankar 

1. Removed logic to update HW producer index in interrupt context.
2. Update HW producer index after UIO ring and buffer gets initialized.

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

diff --git a/drivers/scsi/qedi/qedi_main.c b/drivers/scsi/qedi/qedi_main.c
index 8942f62..053a947 100644
--- a/drivers/scsi/qedi/qedi_main.c
+++ b/drivers/scsi/qedi/qedi_main.c
@@ -665,7 +665,6 @@ static int qedi_ll2_rx(void *cookie, struct sk_buff *skb, 
u32 arg1, u32 arg2)
struct qedi_uio_ctrl *uctrl;
struct skb_work_list *work;
struct ethhdr *eh;
-   u32 prod;
 
if (!qedi) {
QEDI_ERR(NULL, "qedi is NULL\n");
@@ -724,17 +723,10 @@ static int qedi_ll2_rx(void *cookie, struct sk_buff *skb, 
u32 arg1, u32 arg2)
 
spin_lock_bh(&qedi->ll2_lock);
list_add_tail(&work->list, &qedi->ll2_skb_list);
+   spin_unlock_bh(&qedi->ll2_lock);
 
-   ++uctrl->hw_rx_prod_cnt;
-   prod = (uctrl->hw_rx_prod + 1) % RX_RING;
-   if (prod != uctrl->host_rx_cons) {
-   uctrl->hw_rx_prod = prod;
-   spin_unlock_bh(&qedi->ll2_lock);
-   wake_up_process(qedi->ll2_recv_thread);
-   return 0;
-   }
+   wake_up_process(qedi->ll2_recv_thread);
 
-   spin_unlock_bh(&qedi->ll2_lock);
return 0;
 }
 
@@ -749,6 +741,7 @@ static int qedi_ll2_process_skb(struct qedi_ctx *qedi, 
struct sk_buff *skb,
u32 rx_bd_prod;
void *pkt;
int len = 0;
+   u32 prod;
 
if (!qedi) {
QEDI_ERR(NULL, "qedi is NULL\n");
@@ -757,12 +750,16 @@ static int qedi_ll2_process_skb(struct qedi_ctx *qedi, 
struct sk_buff *skb,
 
udev = qedi->udev;
uctrl = udev->uctrl;
-   pkt = udev->rx_pkt + (uctrl->hw_rx_prod * qedi_ll2_buf_size);
+
+   ++uctrl->hw_rx_prod_cnt;
+   prod = (uctrl->hw_rx_prod + 1) % RX_RING;
+
+   pkt = udev->rx_pkt + (prod * qedi_ll2_buf_size);
len = min_t(u32, skb->len, (u32)qedi_ll2_buf_size);
memcpy(pkt, skb->data, len);
 
memset(&rxbd, 0, sizeof(rxbd));
-   rxbd.rx_pkt_index = uctrl->hw_rx_prod;
+   rxbd.rx_pkt_index = prod;
rxbd.rx_pkt_len = len;
rxbd.vlan_id = vlan_id;
 
@@ -773,6 +770,16 @@ static int qedi_ll2_process_skb(struct qedi_ctx *qedi, 
struct sk_buff *skb,
 
memcpy(p_rxbd, &rxbd, sizeof(rxbd));
 
+   QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_LL2,
+ "hw_rx_prod [%d] prod [%d] hw_rx_bd_prod [%d] rx_pkt_idx [%d] 
rx_len [%d].\n",
+ uctrl->hw_rx_prod, prod, uctrl->hw_rx_bd_prod,
+ rxbd.rx_pkt_index, rxbd.rx_pkt_len);
+   QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_LL2,
+ "host_rx_cons [%d] hw_rx_bd_cons [%d].\n",
+ uctrl->host_rx_cons, uctrl->host_rx_bd_cons);
+
+   uctrl->hw_rx_prod = prod;
+
/* notify the iscsiuio about new packet */
uio_event_notify(&udev->qedi_uinfo);
 
-- 
1.8.3.1



[PATCH v2 4/9] qedi: Allocate IRQs based on msix_cnt

2018-11-21 Thread Nilesh Javali
The driver load on some systems failed with error,
[0004:01:00.5]:[qedi_request_msix_irq:2524]:8: request_irq failed.

Allocate the IRQs based on MSIX count obtained from qed module
instead of number of queues.

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

diff --git a/drivers/scsi/qedi/qedi_main.c b/drivers/scsi/qedi/qedi_main.c
index a1225ae..5308e6b 100644
--- a/drivers/scsi/qedi/qedi_main.c
+++ b/drivers/scsi/qedi/qedi_main.c
@@ -1298,7 +1298,7 @@ static int qedi_request_msix_irq(struct qedi_ctx *qedi)
int i, rc, cpu;
 
cpu = cpumask_first(cpu_online_mask);
-   for (i = 0; i < MIN_NUM_CPUS_MSIX(qedi); i++) {
+   for (i = 0; i < qedi->int_info.msix_cnt; i++) {
rc = request_irq(qedi->int_info.msix[i].vector,
 qedi_msix_handler, 0, "qedi",
 &qedi->fp_array[i]);
-- 
1.8.3.1



[PATCH v2 6/9] qedi: Add packet filter in light L2 Rx path.

2018-11-21 Thread Nilesh Javali
From: Manish Rangankar 

Add packet filter to avoid unnecessary packet processing in iscsiuio.

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

diff --git a/drivers/scsi/qedi/qedi_main.c b/drivers/scsi/qedi/qedi_main.c
index 713db9c..2621dee 100644
--- a/drivers/scsi/qedi/qedi_main.c
+++ b/drivers/scsi/qedi/qedi_main.c
@@ -659,6 +659,7 @@ static int qedi_ll2_rx(void *cookie, struct sk_buff *skb, 
u32 arg1, u32 arg2)
struct qedi_uio_dev *udev;
struct qedi_uio_ctrl *uctrl;
struct skb_work_list *work;
+   struct ethhdr *eh;
u32 prod;
 
if (!qedi) {
@@ -673,6 +674,29 @@ static int qedi_ll2_rx(void *cookie, struct sk_buff *skb, 
u32 arg1, u32 arg2)
return 0;
}
 
+   eh = (struct ethhdr *)skb->data;
+   /* Undo VLAN encapsulation */
+   if (eh->h_proto == htons(ETH_P_8021Q)) {
+   memmove((u8 *)eh + VLAN_HLEN, eh, ETH_ALEN * 2);
+   eh = (struct ethhdr *)skb_pull(skb, VLAN_HLEN);
+   skb_reset_mac_header(skb);
+   }
+
+   /* Filter out non FIP/FCoE frames here to free them faster */
+   if (eh->h_proto != htons(ETH_P_ARP) &&
+   eh->h_proto != htons(ETH_P_IP) &&
+   eh->h_proto != htons(ETH_P_IPV6)) {
+   QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_LL2,
+ "Dropping frame ethertype [0x%x] len [0x%x].\n",
+ eh->h_proto, skb->len);
+   kfree_skb(skb);
+   return 0;
+   }
+
+   QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_LL2,
+ "Allowed frame ethertype [0x%x] len [0x%x].\n",
+ eh->h_proto, skb->len);
+
udev = qedi->udev;
uctrl = udev->uctrl;
 
-- 
1.8.3.1



[PATCH v2 3/9] qedi: Replace PAGE_SIZE with QEDI_PAGE_SIZE

2018-11-21 Thread Nilesh Javali
Use QEDI_PAGE_SIZE for enablement of module on systems with 64K page size.

Signed-off-by: Nilesh Javali 
---
 drivers/scsi/qedi/qedi_main.c | 16 +---
 1 file changed, 9 insertions(+), 7 deletions(-)

diff --git a/drivers/scsi/qedi/qedi_main.c b/drivers/scsi/qedi/qedi_main.c
index 0f8eb5f..a1225ae 100644
--- a/drivers/scsi/qedi/qedi_main.c
+++ b/drivers/scsi/qedi/qedi_main.c
@@ -796,7 +796,7 @@ static int qedi_set_iscsi_pf_param(struct qedi_ctx *qedi)
int rval = 0;
 
 
-   num_sq_pages = (MAX_OUTSTANDING_TASKS_PER_CON * 8) / PAGE_SIZE;
+   num_sq_pages = (MAX_OUTSTANDING_TASKS_PER_CON * 8) / QEDI_PAGE_SIZE;
 
qedi->num_queues = MIN_NUM_CPUS_MSIX(qedi);
 
@@ -834,7 +834,7 @@ static int qedi_set_iscsi_pf_param(struct qedi_ctx *qedi)
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)
+   if ((1 << log_page_size) == QEDI_PAGE_SIZE)
break;
}
qedi->pf_params.iscsi_pf_params.log_page_size = log_page_size;
@@ -1376,7 +1376,7 @@ static void qedi_free_bdq(struct qedi_ctx *qedi)
int i;
 
if (qedi->bdq_pbl_list)
-   dma_free_coherent(&qedi->pdev->dev, PAGE_SIZE,
+   dma_free_coherent(&qedi->pdev->dev, QEDI_PAGE_SIZE,
  qedi->bdq_pbl_list, qedi->bdq_pbl_list_dma);
 
if (qedi->bdq_pbl)
@@ -1437,7 +1437,7 @@ static int qedi_alloc_bdq(struct qedi_ctx *qedi)
 
/* Alloc dma memory for BDQ page buffer list */
qedi->bdq_pbl_mem_size = QEDI_BDQ_NUM * sizeof(struct scsi_bd);
-   qedi->bdq_pbl_mem_size = ALIGN(qedi->bdq_pbl_mem_size, PAGE_SIZE);
+   qedi->bdq_pbl_mem_size = ALIGN(qedi->bdq_pbl_mem_size, QEDI_PAGE_SIZE);
qedi->rq_num_entries = qedi->bdq_pbl_mem_size / sizeof(struct scsi_bd);
 
QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_CONN, "rq_num_entries = %d.\n",
@@ -1472,7 +1472,8 @@ static int qedi_alloc_bdq(struct qedi_ctx *qedi)
}
 
/* Allocate list of PBL pages */
-   qedi->bdq_pbl_list = dma_zalloc_coherent(&qedi->pdev->dev, PAGE_SIZE,
+   qedi->bdq_pbl_list = dma_zalloc_coherent(&qedi->pdev->dev,
+QEDI_PAGE_SIZE,
 &qedi->bdq_pbl_list_dma,
 GFP_KERNEL);
if (!qedi->bdq_pbl_list) {
@@ -1485,13 +1486,14 @@ static int qedi_alloc_bdq(struct qedi_ctx *qedi)
 * Now populate PBL list with pages that contain pointers to the
 * individual buffers.
 */
-   qedi->bdq_pbl_list_num_entries = qedi->bdq_pbl_mem_size / PAGE_SIZE;
+   qedi->bdq_pbl_list_num_entries = qedi->bdq_pbl_mem_size /
+QEDI_PAGE_SIZE;
list = (u64 *)qedi->bdq_pbl_list;
page = qedi->bdq_pbl_list_dma;
for (i = 0; i < qedi->bdq_pbl_list_num_entries; i++) {
*list = qedi->bdq_pbl_dma;
list++;
-   page += PAGE_SIZE;
+   page += QEDI_PAGE_SIZE;
}
 
return 0;
-- 
1.8.3.1



[PATCH v2 2/9] qedi: Fix spelling mistake "OUSTANDING" -> "OUTSTANDING"

2018-11-21 Thread Nilesh Javali
Fix trivial spelling mistake within macro definition.

Signed-off-by: Nilesh Javali 
---
 drivers/scsi/qedi/qedi.h  | 4 ++--
 drivers/scsi/qedi/qedi_main.c | 2 +-
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/scsi/qedi/qedi.h b/drivers/scsi/qedi/qedi.h
index e966855..6fa02c5 100644
--- a/drivers/scsi/qedi/qedi.h
+++ b/drivers/scsi/qedi/qedi.h
@@ -45,7 +45,7 @@
 #define QEDI_MAX_TASK_NUM  0x0FFF
 #define QEDI_MAX_ISCSI_CONNS_PER_HBA   1024
 #define QEDI_ISCSI_MAX_BDS_PER_CMD 255 /* Firmware max BDs is 255 */
-#define MAX_OUSTANDING_TASKS_PER_CON   1024
+#define MAX_OUTSTANDING_TASKS_PER_CON  1024
 
 #define QEDI_MAX_BD_LEN0x
 #define QEDI_BD_SPLIT_SZ   0x1000
@@ -144,7 +144,7 @@ struct skb_work_list {
 };
 
 /* Queue sizes in number of elements */
-#define QEDI_SQ_SIZE   MAX_OUSTANDING_TASKS_PER_CON
+#define QEDI_SQ_SIZE   MAX_OUTSTANDING_TASKS_PER_CON
 #define QEDI_CQ_SIZE   2048
 #define QEDI_CMDQ_SIZE QEDI_MAX_ISCSI_TASK
 #define QEDI_PROTO_CQ_PROD_IDX 0
diff --git a/drivers/scsi/qedi/qedi_main.c b/drivers/scsi/qedi/qedi_main.c
index 105b0e4..0f8eb5f 100644
--- a/drivers/scsi/qedi/qedi_main.c
+++ b/drivers/scsi/qedi/qedi_main.c
@@ -796,7 +796,7 @@ static int qedi_set_iscsi_pf_param(struct qedi_ctx *qedi)
int rval = 0;
 
 
-   num_sq_pages = (MAX_OUSTANDING_TASKS_PER_CON * 8) / PAGE_SIZE;
+   num_sq_pages = (MAX_OUTSTANDING_TASKS_PER_CON * 8) / PAGE_SIZE;
 
qedi->num_queues = MIN_NUM_CPUS_MSIX(qedi);
 
-- 
1.8.3.1



[PATCH v2 1/9] qedi: Cleanup redundant QEDI_PAGE_SIZE macro definition

2018-11-21 Thread Nilesh Javali
Remove redundant macro definition.

Signed-off-by: Nilesh Javali 
---
 drivers/scsi/qedi/qedi.h | 2 --
 1 file changed, 2 deletions(-)

diff --git a/drivers/scsi/qedi/qedi.h b/drivers/scsi/qedi/qedi.h
index a6f96b3..e966855 100644
--- a/drivers/scsi/qedi/qedi.h
+++ b/drivers/scsi/qedi/qedi.h
@@ -64,11 +64,9 @@
 #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_HW_DMA_BOUNDARY   0xfff
 #define QEDI_PATH_HANDLE   0xFE000UL
 
-- 
1.8.3.1



[PATCH v2 0/9] qedi bug fixes

2018-11-21 Thread Nilesh Javali
Martin,
Please consider below patch set for next 'scsi-fixes' submission.

Thanks,
Nilesh

Manish Rangankar (3):
  qedi: Check for session online before getting iSCSI TLV data.
  qedi: Add packet filter in light L2 Rx path.
  qedi: Move LL2 producer index processing in BH.

Nilesh Javali (6):
  qedi: Cleanup redundant QEDI_PAGE_SIZE macro definition
  qedi: Fix spelling mistake "OUSTANDING" -> "OUTSTANDING"
  qedi: Replace PAGE_SIZE with QEDI_PAGE_SIZE
  qedi: Allocate IRQs based on msix_cnt
  qedi: add module param to set ping packet size
  qedi: Update driver version to 8.33.0.21

 drivers/scsi/qedi/qedi.h |  7 +---
 drivers/scsi/qedi/qedi_main.c| 87 +---
 drivers/scsi/qedi/qedi_version.h |  4 +-
 3 files changed, 68 insertions(+), 30 deletions(-)

-- 
1.8.3.1



[PATCH 6/8] qedi: Add packet filter in light L2 Rx path.

2018-11-20 Thread Nilesh Javali
From: Manish Rangankar 

Add packet filter to avoid unnecessary packet processing in iscsiuio.

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

diff --git a/drivers/scsi/qedi/qedi_main.c b/drivers/scsi/qedi/qedi_main.c
index 713db9c..2621dee 100644
--- a/drivers/scsi/qedi/qedi_main.c
+++ b/drivers/scsi/qedi/qedi_main.c
@@ -659,6 +659,7 @@ static int qedi_ll2_rx(void *cookie, struct sk_buff *skb, 
u32 arg1, u32 arg2)
struct qedi_uio_dev *udev;
struct qedi_uio_ctrl *uctrl;
struct skb_work_list *work;
+   struct ethhdr *eh;
u32 prod;
 
if (!qedi) {
@@ -673,6 +674,29 @@ static int qedi_ll2_rx(void *cookie, struct sk_buff *skb, 
u32 arg1, u32 arg2)
return 0;
}
 
+   eh = (struct ethhdr *)skb->data;
+   /* Undo VLAN encapsulation */
+   if (eh->h_proto == htons(ETH_P_8021Q)) {
+   memmove((u8 *)eh + VLAN_HLEN, eh, ETH_ALEN * 2);
+   eh = (struct ethhdr *)skb_pull(skb, VLAN_HLEN);
+   skb_reset_mac_header(skb);
+   }
+
+   /* Filter out non FIP/FCoE frames here to free them faster */
+   if (eh->h_proto != htons(ETH_P_ARP) &&
+   eh->h_proto != htons(ETH_P_IP) &&
+   eh->h_proto != htons(ETH_P_IPV6)) {
+   QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_LL2,
+ "Dropping frame ethertype [0x%x] len [0x%x].\n",
+ eh->h_proto, skb->len);
+   kfree_skb(skb);
+   return 0;
+   }
+
+   QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_LL2,
+ "Allowed frame ethertype [0x%x] len [0x%x].\n",
+ eh->h_proto, skb->len);
+
udev = qedi->udev;
uctrl = udev->uctrl;
 
-- 
1.8.3.1



[PATCH 8/8] qedi: Update driver version to 8.33.0.21

2018-11-20 Thread Nilesh Javali
Signed-off-by: Nilesh Javali 
---
 drivers/scsi/qedi/qedi_version.h | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/scsi/qedi/qedi_version.h b/drivers/scsi/qedi/qedi_version.h
index 8a0e523..41bcbba 100644
--- a/drivers/scsi/qedi/qedi_version.h
+++ b/drivers/scsi/qedi/qedi_version.h
@@ -7,8 +7,8 @@
  * this source tree.
  */
 
-#define QEDI_MODULE_VERSION"8.33.0.20"
+#define QEDI_MODULE_VERSION"8.33.0.21"
 #define QEDI_DRIVER_MAJOR_VER  8
 #define QEDI_DRIVER_MINOR_VER  33
 #define QEDI_DRIVER_REV_VER0
-#define QEDI_DRIVER_ENG_VER20
+#define QEDI_DRIVER_ENG_VER21
-- 
1.8.3.1



[PATCH 4/8] qedi: Allocate IRQs based on msix_cnt

2018-11-20 Thread Nilesh Javali
The driver load on some systems failed with error,
[0004:01:00.5]:[qedi_request_msix_irq:2524]:8: request_irq failed.

Allocate the IRQs based on MSIX count obtained from qed module
instead of number of queues.

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

diff --git a/drivers/scsi/qedi/qedi_main.c b/drivers/scsi/qedi/qedi_main.c
index a1225ae..5308e6b 100644
--- a/drivers/scsi/qedi/qedi_main.c
+++ b/drivers/scsi/qedi/qedi_main.c
@@ -1298,7 +1298,7 @@ static int qedi_request_msix_irq(struct qedi_ctx *qedi)
int i, rc, cpu;
 
cpu = cpumask_first(cpu_online_mask);
-   for (i = 0; i < MIN_NUM_CPUS_MSIX(qedi); i++) {
+   for (i = 0; i < qedi->int_info.msix_cnt; i++) {
rc = request_irq(qedi->int_info.msix[i].vector,
 qedi_msix_handler, 0, "qedi",
 &qedi->fp_array[i]);
-- 
1.8.3.1



[PATCH 3/8] qedi: Replace PAGE_SIZE with QEDI_PAGE_SIZE

2018-11-20 Thread Nilesh Javali
Use QEDI_PAGE_SIZE for enablement of module on systems with 64K page size.

Signed-off-by: Nilesh Javali 
---
 drivers/scsi/qedi/qedi_main.c | 16 +---
 1 file changed, 9 insertions(+), 7 deletions(-)

diff --git a/drivers/scsi/qedi/qedi_main.c b/drivers/scsi/qedi/qedi_main.c
index 0f8eb5f..a1225ae 100644
--- a/drivers/scsi/qedi/qedi_main.c
+++ b/drivers/scsi/qedi/qedi_main.c
@@ -796,7 +796,7 @@ static int qedi_set_iscsi_pf_param(struct qedi_ctx *qedi)
int rval = 0;
 
 
-   num_sq_pages = (MAX_OUTSTANDING_TASKS_PER_CON * 8) / PAGE_SIZE;
+   num_sq_pages = (MAX_OUTSTANDING_TASKS_PER_CON * 8) / QEDI_PAGE_SIZE;
 
qedi->num_queues = MIN_NUM_CPUS_MSIX(qedi);
 
@@ -834,7 +834,7 @@ static int qedi_set_iscsi_pf_param(struct qedi_ctx *qedi)
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)
+   if ((1 << log_page_size) == QEDI_PAGE_SIZE)
break;
}
qedi->pf_params.iscsi_pf_params.log_page_size = log_page_size;
@@ -1376,7 +1376,7 @@ static void qedi_free_bdq(struct qedi_ctx *qedi)
int i;
 
if (qedi->bdq_pbl_list)
-   dma_free_coherent(&qedi->pdev->dev, PAGE_SIZE,
+   dma_free_coherent(&qedi->pdev->dev, QEDI_PAGE_SIZE,
  qedi->bdq_pbl_list, qedi->bdq_pbl_list_dma);
 
if (qedi->bdq_pbl)
@@ -1437,7 +1437,7 @@ static int qedi_alloc_bdq(struct qedi_ctx *qedi)
 
/* Alloc dma memory for BDQ page buffer list */
qedi->bdq_pbl_mem_size = QEDI_BDQ_NUM * sizeof(struct scsi_bd);
-   qedi->bdq_pbl_mem_size = ALIGN(qedi->bdq_pbl_mem_size, PAGE_SIZE);
+   qedi->bdq_pbl_mem_size = ALIGN(qedi->bdq_pbl_mem_size, QEDI_PAGE_SIZE);
qedi->rq_num_entries = qedi->bdq_pbl_mem_size / sizeof(struct scsi_bd);
 
QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_CONN, "rq_num_entries = %d.\n",
@@ -1472,7 +1472,8 @@ static int qedi_alloc_bdq(struct qedi_ctx *qedi)
}
 
/* Allocate list of PBL pages */
-   qedi->bdq_pbl_list = dma_zalloc_coherent(&qedi->pdev->dev, PAGE_SIZE,
+   qedi->bdq_pbl_list = dma_zalloc_coherent(&qedi->pdev->dev,
+QEDI_PAGE_SIZE,
 &qedi->bdq_pbl_list_dma,
 GFP_KERNEL);
if (!qedi->bdq_pbl_list) {
@@ -1485,13 +1486,14 @@ static int qedi_alloc_bdq(struct qedi_ctx *qedi)
 * Now populate PBL list with pages that contain pointers to the
 * individual buffers.
 */
-   qedi->bdq_pbl_list_num_entries = qedi->bdq_pbl_mem_size / PAGE_SIZE;
+   qedi->bdq_pbl_list_num_entries = qedi->bdq_pbl_mem_size /
+QEDI_PAGE_SIZE;
list = (u64 *)qedi->bdq_pbl_list;
page = qedi->bdq_pbl_list_dma;
for (i = 0; i < qedi->bdq_pbl_list_num_entries; i++) {
*list = qedi->bdq_pbl_dma;
list++;
-   page += PAGE_SIZE;
+   page += QEDI_PAGE_SIZE;
}
 
return 0;
-- 
1.8.3.1



[PATCH 2/8] qedi: Fix spelling mistake "OUSTANDING" -> "OUTSTANDING"

2018-11-20 Thread Nilesh Javali
Fix trivial spelling mistake within macro definition.

Signed-off-by: Nilesh Javali 
---
 drivers/scsi/qedi/qedi.h  | 4 ++--
 drivers/scsi/qedi/qedi_main.c | 2 +-
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/scsi/qedi/qedi.h b/drivers/scsi/qedi/qedi.h
index e966855..6fa02c5 100644
--- a/drivers/scsi/qedi/qedi.h
+++ b/drivers/scsi/qedi/qedi.h
@@ -45,7 +45,7 @@
 #define QEDI_MAX_TASK_NUM  0x0FFF
 #define QEDI_MAX_ISCSI_CONNS_PER_HBA   1024
 #define QEDI_ISCSI_MAX_BDS_PER_CMD 255 /* Firmware max BDs is 255 */
-#define MAX_OUSTANDING_TASKS_PER_CON   1024
+#define MAX_OUTSTANDING_TASKS_PER_CON  1024
 
 #define QEDI_MAX_BD_LEN0x
 #define QEDI_BD_SPLIT_SZ   0x1000
@@ -144,7 +144,7 @@ struct skb_work_list {
 };
 
 /* Queue sizes in number of elements */
-#define QEDI_SQ_SIZE   MAX_OUSTANDING_TASKS_PER_CON
+#define QEDI_SQ_SIZE   MAX_OUTSTANDING_TASKS_PER_CON
 #define QEDI_CQ_SIZE   2048
 #define QEDI_CMDQ_SIZE QEDI_MAX_ISCSI_TASK
 #define QEDI_PROTO_CQ_PROD_IDX 0
diff --git a/drivers/scsi/qedi/qedi_main.c b/drivers/scsi/qedi/qedi_main.c
index 105b0e4..0f8eb5f 100644
--- a/drivers/scsi/qedi/qedi_main.c
+++ b/drivers/scsi/qedi/qedi_main.c
@@ -796,7 +796,7 @@ static int qedi_set_iscsi_pf_param(struct qedi_ctx *qedi)
int rval = 0;
 
 
-   num_sq_pages = (MAX_OUSTANDING_TASKS_PER_CON * 8) / PAGE_SIZE;
+   num_sq_pages = (MAX_OUTSTANDING_TASKS_PER_CON * 8) / PAGE_SIZE;
 
qedi->num_queues = MIN_NUM_CPUS_MSIX(qedi);
 
-- 
1.8.3.1



[PATCH 1/8] qedi: Cleanup redundant QEDI_PAGE_SIZE macro definition

2018-11-20 Thread Nilesh Javali
Remove redundant macro definition.

Signed-off-by: Nilesh Javali 
---
 drivers/scsi/qedi/qedi.h | 2 --
 1 file changed, 2 deletions(-)

diff --git a/drivers/scsi/qedi/qedi.h b/drivers/scsi/qedi/qedi.h
index a6f96b3..e966855 100644
--- a/drivers/scsi/qedi/qedi.h
+++ b/drivers/scsi/qedi/qedi.h
@@ -64,11 +64,9 @@
 #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_HW_DMA_BOUNDARY   0xfff
 #define QEDI_PATH_HANDLE   0xFE000UL
 
-- 
1.8.3.1



[PATCH 7/8] qedi: Move LL2 producer index processing in BH.

2018-11-20 Thread Nilesh Javali
From: Manish Rangankar 

1. Removed logic to update HW producer index in interrupt context.
2. Update HW producer index after UIO ring and buffer gets initialized.

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

diff --git a/drivers/scsi/qedi/qedi_main.c b/drivers/scsi/qedi/qedi_main.c
index 2621dee..c9dcd7bd 100644
--- a/drivers/scsi/qedi/qedi_main.c
+++ b/drivers/scsi/qedi/qedi_main.c
@@ -660,7 +660,6 @@ static int qedi_ll2_rx(void *cookie, struct sk_buff *skb, 
u32 arg1, u32 arg2)
struct qedi_uio_ctrl *uctrl;
struct skb_work_list *work;
struct ethhdr *eh;
-   u32 prod;
 
if (!qedi) {
QEDI_ERR(NULL, "qedi is NULL\n");
@@ -719,17 +718,10 @@ static int qedi_ll2_rx(void *cookie, struct sk_buff *skb, 
u32 arg1, u32 arg2)
 
spin_lock_bh(&qedi->ll2_lock);
list_add_tail(&work->list, &qedi->ll2_skb_list);
+   spin_unlock_bh(&qedi->ll2_lock);
 
-   ++uctrl->hw_rx_prod_cnt;
-   prod = (uctrl->hw_rx_prod + 1) % RX_RING;
-   if (prod != uctrl->host_rx_cons) {
-   uctrl->hw_rx_prod = prod;
-   spin_unlock_bh(&qedi->ll2_lock);
-   wake_up_process(qedi->ll2_recv_thread);
-   return 0;
-   }
+   wake_up_process(qedi->ll2_recv_thread);
 
-   spin_unlock_bh(&qedi->ll2_lock);
return 0;
 }
 
@@ -744,6 +736,7 @@ static int qedi_ll2_process_skb(struct qedi_ctx *qedi, 
struct sk_buff *skb,
u32 rx_bd_prod;
void *pkt;
int len = 0;
+   u32 prod;
 
if (!qedi) {
QEDI_ERR(NULL, "qedi is NULL\n");
@@ -752,12 +745,16 @@ static int qedi_ll2_process_skb(struct qedi_ctx *qedi, 
struct sk_buff *skb,
 
udev = qedi->udev;
uctrl = udev->uctrl;
-   pkt = udev->rx_pkt + (uctrl->hw_rx_prod * LL2_SINGLE_BUF_SIZE);
+
+   ++uctrl->hw_rx_prod_cnt;
+   prod = (uctrl->hw_rx_prod + 1) % RX_RING;
+
+   pkt = udev->rx_pkt + (prod * qedi_ll2_buf_size);
len = min_t(u32, skb->len, (u32)LL2_SINGLE_BUF_SIZE);
memcpy(pkt, skb->data, len);
 
memset(&rxbd, 0, sizeof(rxbd));
-   rxbd.rx_pkt_index = uctrl->hw_rx_prod;
+   rxbd.rx_pkt_index = prod;
rxbd.rx_pkt_len = len;
rxbd.vlan_id = vlan_id;
 
@@ -768,6 +765,16 @@ static int qedi_ll2_process_skb(struct qedi_ctx *qedi, 
struct sk_buff *skb,
 
memcpy(p_rxbd, &rxbd, sizeof(rxbd));
 
+   QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_LL2,
+ "hw_rx_prod [%d] prod [%d] hw_rx_bd_prod [%d] rx_pkt_idx [%d] 
rx_len [%d].\n",
+ uctrl->hw_rx_prod, prod, uctrl->hw_rx_bd_prod,
+ rxbd.rx_pkt_index, rxbd.rx_pkt_len);
+   QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_LL2,
+ "host_rx_cons [%d] hw_rx_bd_cons [%d].\n",
+ uctrl->host_rx_cons, uctrl->host_rx_bd_cons);
+
+   uctrl->hw_rx_prod = prod;
+
/* notify the iscsiuio about new packet */
uio_event_notify(&udev->qedi_uinfo);
 
-- 
1.8.3.1



[PATCH 5/8] qedi: Check for session online before getting iSCSI TLV data.

2018-11-20 Thread Nilesh Javali
From: Manish Rangankar 

The kernel panic was observed after switch side perturbation,

BUG: unable to handle kernel NULL pointer dereference at (null)
 IP: [] strcmp+0x20/0x40
 PGD 0 Oops:  [#1] SMP
CPU: 8 PID: 647 Comm: kworker/8:1 Tainted: GW  OE     
3.10.0-693.el7.x86_64 #1
Hardware name: HPE ProLiant DL380 Gen10/ProLiant DL380 Gen10, BIOS U30 
06/20/2018
Workqueue: slowpath-13:00. qed_slowpath_task [qed]
task: 880429eb8fd0 ti: 88042919 task.ti: 88042919
RIP: 0010:[]  [] strcmp+0x20/0x40
RSP: 0018:880429193c68  EFLAGS: 00010202
RAX: 000a RBX: 0002 RCX: 
RDX: 0001 RSI: 0001 RDI: 88042bda7a41
RBP: 880429193c68 R08:  R09: 
R10: 0007 R11: 88042b3af338 R12: 880420b007a0
R13: 88081aa56af8 R14: 0001 R15: 88081aa50410
FS:  () GS:88042fe0() knlGS:
CS:  0010 DS:  ES:  CR0: 80050033
CR2:  CR3: 019f2000 CR4: 003407e0
DR0:  DR1:  DR2: 
DR3:  DR6: fffe0ff0 DR7: 0400
Stack:
880429193d20 c02a0c90 c90004b32000 8803fd3ec600
88042bda7800 88042bda7a00 88042bda7840 88042bda7a40
000129193d10 2e3836312e323931 ff000a342e363232 c01ad99d
Call Trace:
[] qedi_get_protocol_tlv_data+0x270/0x470 [qedi]
[] ? qed_mfw_process_tlv_req+0x24d/0xbf0 [qed]
[] qed_mfw_fill_tlv_data+0x5e/0xd0 [qed]
[] qed_mfw_process_tlv_req+0x269/0xbf0 [qed]

Fix kernel NULL pointer deref by checking for session is online
before getting iSCSI TLV data.

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

diff --git a/drivers/scsi/qedi/qedi_main.c b/drivers/scsi/qedi/qedi_main.c
index 5308e6b..713db9c 100644
--- a/drivers/scsi/qedi/qedi_main.c
+++ b/drivers/scsi/qedi/qedi_main.c
@@ -952,6 +952,9 @@ static int qedi_find_boot_info(struct qedi_ctx *qedi,
cls_sess = iscsi_conn_to_session(cls_conn);
sess = cls_sess->dd_data;
 
+   if (!iscsi_is_session_online(cls_sess))
+   continue;
+
if (pri_ctrl_flags) {
if (!strcmp(pri_tgt->iscsi_name, sess->targetname) &&
!strcmp(pri_tgt->ip_addr, ep_ip_addr)) {
-- 
1.8.3.1



[PATCH 0/8] qedi bug fixes

2018-11-20 Thread Nilesh Javali
Martin,
Please consider below patch set for next 'scsi-fixes' submission.

Thanks,
Nilesh

Manish Rangankar (3):
  qedi: Check for session online before getting iSCSI TLV data.
  qedi: Add packet filter in light L2 Rx path.
  qedi: Move LL2 producer index processing in BH.

Nilesh Javali (5):
  qedi: Cleanup redundant QEDI_PAGE_SIZE macro definition
  qedi: Fix spelling mistake "OUSTANDING" -> "OUTSTANDING"
  qedi: Replace PAGE_SIZE with QEDI_PAGE_SIZE
  qedi: Allocate IRQs based on msix_cnt
  qedi: Update driver version to 8.33.0.21

 drivers/scsi/qedi/qedi.h |  6 ++--
 drivers/scsi/qedi/qedi_main.c| 76 +---
 drivers/scsi/qedi/qedi_version.h |  4 +--
 3 files changed, 60 insertions(+), 26 deletions(-)

-- 
1.8.3.1



[PATCH] qedi: Initialize the stats mutex lock

2018-09-27 Thread Nilesh Javali
Fix kernel NULL pointer dereference,

Call Trace:
  [] __mutex_lock_slowpath+0xa6/0x1d0
  [] mutex_lock+0x1f/0x2f
  [] qedi_get_protocol_tlv_data+0x61/0x450 [qedi]
  [] ? map_vm_area+0x2e/0x40
  [] ? __vmalloc_node_range+0x170/0x280
  [] ? qed_mfw_process_tlv_req+0x27d/0xbd0 [qed]
  [] qed_mfw_fill_tlv_data+0x4b/0xb0 [qed]
  [] qed_mfw_process_tlv_req+0x299/0xbd0 [qed]
  [] ? __switch_to+0xce/0x580
  [] qed_slowpath_task+0x5b/0x80 [qed]

Signed-off-by: Nilesh Javali 
---
 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 cc8e64d..e5bd035 100644
--- a/drivers/scsi/qedi/qedi_main.c
+++ b/drivers/scsi/qedi/qedi_main.c
@@ -2472,6 +2472,7 @@ static int __qedi_probe(struct pci_dev *pdev, int mode)
/* start qedi context */
spin_lock_init(&qedi->hba_lock);
spin_lock_init(&qedi->task_idx_lock);
+   mutex_init(&qedi->stats_lock);
}
qedi_ops->ll2->register_cb_ops(qedi->cdev, &qedi_ll2_cb_ops, qedi);
qedi_ops->ll2->start(qedi->cdev, ¶ms);
-- 
1.8.3.1



[PATCH] qedi: Add the CRC size within iSCSI NVM image

2018-08-29 Thread Nilesh Javali
The QED driver commit,
1ac4329 qed: Add configuration information to register dump and debug data,
removes the CRC length validation causing nvm_get_image failure while
loading qedi driver,

[qed_mcp_get_nvm_image:2700(host_10-0)]Image [0] is too big - 6008 bytes
where only 6004 are available
[qedi_get_boot_info:2253]:10: Could not get NVM image. ret = -12

Hence add and adjust the CRC size to iSCSI NVM image to read boot info at
qedi load time.

Signed-off-by: Nilesh Javali 
---
 drivers/scsi/qedi/qedi.h  |  7 ++-
 drivers/scsi/qedi/qedi_main.c | 28 +++-
 2 files changed, 21 insertions(+), 14 deletions(-)

diff --git a/drivers/scsi/qedi/qedi.h b/drivers/scsi/qedi/qedi.h
index fc3babc..a6f96b3 100644
--- a/drivers/scsi/qedi/qedi.h
+++ b/drivers/scsi/qedi/qedi.h
@@ -77,6 +77,11 @@ enum qedi_nvm_tgts {
QEDI_NVM_TGT_SEC,
 };
 
+struct qedi_nvm_iscsi_image {
+   struct nvm_iscsi_cfg iscsi_cfg;
+   u32 crc;
+};
+
 struct qedi_uio_ctrl {
/* meta data */
u32 uio_hsi_version;
@@ -294,7 +299,7 @@ struct qedi_ctx {
void *bdq_pbl_list;
dma_addr_t bdq_pbl_list_dma;
u8 bdq_pbl_list_num_entries;
-   struct nvm_iscsi_cfg *iscsi_cfg;
+   struct qedi_nvm_iscsi_image *iscsi_image;
dma_addr_t nvm_buf_dma;
void __iomem *bdq_primary_prod;
void __iomem *bdq_secondary_prod;
diff --git a/drivers/scsi/qedi/qedi_main.c b/drivers/scsi/qedi/qedi_main.c
index aa96bcc..cc8e64d 100644
--- a/drivers/scsi/qedi/qedi_main.c
+++ b/drivers/scsi/qedi/qedi_main.c
@@ -1346,23 +1346,26 @@ static int qedi_setup_int(struct qedi_ctx *qedi)
 
 static void qedi_free_nvm_iscsi_cfg(struct qedi_ctx *qedi)
 {
-   if (qedi->iscsi_cfg)
+   if (qedi->iscsi_image)
dma_free_coherent(&qedi->pdev->dev,
- sizeof(struct nvm_iscsi_cfg),
- qedi->iscsi_cfg, qedi->nvm_buf_dma);
+ sizeof(struct qedi_nvm_iscsi_image),
+ qedi->iscsi_image, qedi->nvm_buf_dma);
 }
 
 static int qedi_alloc_nvm_iscsi_cfg(struct qedi_ctx *qedi)
 {
-   qedi->iscsi_cfg = dma_zalloc_coherent(&qedi->pdev->dev,
-sizeof(struct nvm_iscsi_cfg),
-&qedi->nvm_buf_dma, GFP_KERNEL);
-   if (!qedi->iscsi_cfg) {
+   struct qedi_nvm_iscsi_image nvm_image;
+
+   qedi->iscsi_image = dma_zalloc_coherent(&qedi->pdev->dev,
+   sizeof(nvm_image),
+   &qedi->nvm_buf_dma,
+   GFP_KERNEL);
+   if (!qedi->iscsi_image) {
QEDI_ERR(&qedi->dbg_ctx, "Could not allocate NVM BUF.\n");
return -ENOMEM;
}
QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_INFO,
- "NVM BUF addr=0x%p dma=0x%llx.\n", qedi->iscsi_cfg,
+ "NVM BUF addr=0x%p dma=0x%llx.\n", qedi->iscsi_image,
  qedi->nvm_buf_dma);
 
return 0;
@@ -1905,7 +1908,7 @@ void qedi_reset_host_mtu(struct qedi_ctx *qedi, u16 mtu)
struct nvm_iscsi_block *block;
 
pf = qedi->dev_info.common.abs_pf_id;
-   block = &qedi->iscsi_cfg->block[0];
+   block = &qedi->iscsi_image->iscsi_cfg.block[0];
for (i = 0; i < NUM_OF_ISCSI_PF_SUPPORTED; i++, block++) {
flags = ((block->id) & NVM_ISCSI_CFG_BLK_CTRL_FLAG_MASK) >>
NVM_ISCSI_CFG_BLK_CTRL_FLAG_OFFSET;
@@ -2194,15 +2197,14 @@ static void qedi_boot_release(void *data)
 static int qedi_get_boot_info(struct qedi_ctx *qedi)
 {
int ret = 1;
-   u16 len;
-
-   len = sizeof(struct nvm_iscsi_cfg);
+   struct qedi_nvm_iscsi_image nvm_image;
 
QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_INFO,
  "Get NVM iSCSI CFG image\n");
ret = qedi_ops->common->nvm_get_image(qedi->cdev,
  QED_NVM_IMAGE_ISCSI_CFG,
- (char *)qedi->iscsi_cfg, len);
+ (char *)qedi->iscsi_image,
+ sizeof(nvm_image));
if (ret)
QEDI_ERR(&qedi->dbg_ctx,
 "Could not get NVM image. ret = %d\n", ret);
-- 
1.8.3.1



[PATCH 2/2] qedi: Fix truncation of target name

2018-06-27 Thread Nilesh Javali
Use sprintf instead of snprintf to fix truncation of target name.
This fix is extension of patch
"scsi: qedi: Fix truncation of CHAP name and secret".

Signed-off-by: Nilesh Javali 
---
 drivers/scsi/qedi/qedi_main.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/scsi/qedi/qedi_main.c b/drivers/scsi/qedi/qedi_main.c
index cf274a7..85491da 100644
--- a/drivers/scsi/qedi/qedi_main.c
+++ b/drivers/scsi/qedi/qedi_main.c
@@ -888,8 +888,8 @@ static void qedi_get_boot_tgt_info(struct nvm_iscsi_block 
*block,
ipv6_en = !!(block->generic.ctrl_flags &
 NVM_ISCSI_CFG_GEN_IPV6_ENABLED);
 
-   snprintf(tgt->iscsi_name, NVM_ISCSI_CFG_ISCSI_NAME_MAX_LEN, "%s\n",
-block->target[index].target_name.byte);
+   sprintf(tgt->iscsi_name, "%.*s\n", NVM_ISCSI_CFG_ISCSI_NAME_MAX_LEN,
+   block->target[index].target_name.byte);
 
tgt->ipv6_en = ipv6_en;
 
-- 
1.8.3.1



[PATCH 0/2] Bug fixes for static checker warnings

2018-06-27 Thread Nilesh Javali
Martin,
Please consider below patch set for next 'scsi-fixes' submission.

Thanks,
Nilesh

Nilesh Javali (2):
  qedi: Correct the size of target name
  qedi: Fix truncation of target name

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

-- 
1.8.3.1



[PATCH 1/2] qedi: Correct the size of target name

2018-06-27 Thread Nilesh Javali
There is potential buffer overflow while getting the target
name from the NVRAM. Correct the size of the buffer to avoid
overflow.

Signed-off-by: Nilesh Javali 
---
 drivers/scsi/qedi/qedi_iscsi.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/scsi/qedi/qedi_iscsi.h b/drivers/scsi/qedi/qedi_iscsi.h
index 1126077..d690330 100644
--- a/drivers/scsi/qedi/qedi_iscsi.h
+++ b/drivers/scsi/qedi/qedi_iscsi.h
@@ -225,7 +225,7 @@ struct qedi_work_map {
 
 struct qedi_boot_target {
char ip_addr[64];
-   char iscsi_name[255];
+   char iscsi_name[256];
u32 ipv6_en;
 };
 
-- 
1.8.3.1



[PATCH] qedi: Fix static checker warning

2018-06-25 Thread Nilesh Javali
This patch fixes the static checker warning,

drivers/scsi/qedi/qedi_main.c:891 qedi_get_boot_tgt_info()
error: snprintf() is printing too much 256 vs 255

Signed-off-by: Nilesh Javali 
---
 drivers/scsi/qedi/qedi_main.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/scsi/qedi/qedi_main.c b/drivers/scsi/qedi/qedi_main.c
index cf274a7..85491da 100644
--- a/drivers/scsi/qedi/qedi_main.c
+++ b/drivers/scsi/qedi/qedi_main.c
@@ -888,8 +888,8 @@ static void qedi_get_boot_tgt_info(struct nvm_iscsi_block 
*block,
ipv6_en = !!(block->generic.ctrl_flags &
 NVM_ISCSI_CFG_GEN_IPV6_ENABLED);
 
-   snprintf(tgt->iscsi_name, NVM_ISCSI_CFG_ISCSI_NAME_MAX_LEN, "%s\n",
-block->target[index].target_name.byte);
+   sprintf(tgt->iscsi_name, "%.*s\n", NVM_ISCSI_CFG_ISCSI_NAME_MAX_LEN,
+   block->target[index].target_name.byte);
 
tgt->ipv6_en = ipv6_en;
 
-- 
1.8.3.1



[PATCH v3 2/2] qedi: Cleanup local str variable

2018-02-07 Thread Nilesh Javali
Signed-off-by: Nilesh Javali 
---
 drivers/scsi/qedi/qedi_main.c | 43 ---
 1 file changed, 20 insertions(+), 23 deletions(-)

diff --git a/drivers/scsi/qedi/qedi_main.c b/drivers/scsi/qedi/qedi_main.c
index deaed93..47c45a5 100644
--- a/drivers/scsi/qedi/qedi_main.c
+++ b/drivers/scsi/qedi/qedi_main.c
@@ -1735,7 +1735,6 @@ static ssize_t qedi_show_boot_eth_info(void *data, int 
type, char *buf)
 {
struct qedi_ctx *qedi = data;
struct nvm_iscsi_initiator *initiator;
-   char *str = buf;
int rc = 1;
u32 ipv6_en, dhcp_en, ip_len;
struct nvm_iscsi_block *block;
@@ -1769,32 +1768,32 @@ static ssize_t qedi_show_boot_eth_info(void *data, int 
type, char *buf)
 
switch (type) {
case ISCSI_BOOT_ETH_IP_ADDR:
-   rc = snprintf(str, ip_len, fmt, ip);
+   rc = snprintf(buf, ip_len, fmt, ip);
break;
case ISCSI_BOOT_ETH_SUBNET_MASK:
-   rc = snprintf(str, ip_len, fmt, sub);
+   rc = snprintf(buf, ip_len, fmt, sub);
break;
case ISCSI_BOOT_ETH_GATEWAY:
-   rc = snprintf(str, ip_len, fmt, gw);
+   rc = snprintf(buf, ip_len, fmt, gw);
break;
case ISCSI_BOOT_ETH_FLAGS:
-   rc = snprintf(str, 3, "%hhd\n",
+   rc = snprintf(buf, 3, "%hhd\n",
  SYSFS_FLAG_FW_SEL_BOOT);
break;
case ISCSI_BOOT_ETH_INDEX:
-   rc = snprintf(str, 3, "0\n");
+   rc = snprintf(buf, 3, "0\n");
break;
case ISCSI_BOOT_ETH_MAC:
-   rc = sysfs_format_mac(str, qedi->mac, ETH_ALEN);
+   rc = sysfs_format_mac(buf, qedi->mac, ETH_ALEN);
break;
case ISCSI_BOOT_ETH_VLAN:
-   rc = snprintf(str, 12, "%d\n",
+   rc = snprintf(buf, 12, "%d\n",
  GET_FIELD2(initiator->generic_cont0,
 NVM_ISCSI_CFG_INITIATOR_VLAN));
break;
case ISCSI_BOOT_ETH_ORIGIN:
if (dhcp_en)
-   rc = snprintf(str, 3, "3\n");
+   rc = snprintf(buf, 3, "3\n");
break;
default:
rc = 0;
@@ -1830,7 +1829,6 @@ static ssize_t qedi_show_boot_ini_info(void *data, int 
type, char *buf)
 {
struct qedi_ctx *qedi = data;
struct nvm_iscsi_initiator *initiator;
-   char *str = buf;
int rc;
struct nvm_iscsi_block *block;
 
@@ -1842,7 +1840,7 @@ static ssize_t qedi_show_boot_ini_info(void *data, int 
type, char *buf)
 
switch (type) {
case ISCSI_BOOT_INI_INITIATOR_NAME:
-   rc = sprintf(str, "%.*s\n", NVM_ISCSI_CFG_ISCSI_NAME_MAX_LEN,
+   rc = sprintf(buf, "%.*s\n", NVM_ISCSI_CFG_ISCSI_NAME_MAX_LEN,
 initiator->initiator_name.byte);
break;
default:
@@ -1871,7 +1869,6 @@ static umode_t qedi_ini_get_attr_visibility(void *data, 
int type)
 qedi_show_boot_tgt_info(struct qedi_ctx *qedi, int type,
char *buf, enum qedi_nvm_tgts idx)
 {
-   char *str = buf;
int rc = 1;
u32 ctrl_flags, ipv6_en, chap_en, mchap_en, ip_len;
struct nvm_iscsi_block *block;
@@ -1910,48 +1907,48 @@ static umode_t qedi_ini_get_attr_visibility(void *data, 
int type)
 
switch (type) {
case ISCSI_BOOT_TGT_NAME:
-   rc = sprintf(str, "%.*s\n", NVM_ISCSI_CFG_ISCSI_NAME_MAX_LEN,
+   rc = sprintf(buf, "%.*s\n", NVM_ISCSI_CFG_ISCSI_NAME_MAX_LEN,
 block->target[idx].target_name.byte);
break;
case ISCSI_BOOT_TGT_IP_ADDR:
if (ipv6_en)
-   rc = snprintf(str, ip_len, "%pI6\n",
+   rc = snprintf(buf, ip_len, "%pI6\n",
  block->target[idx].ipv6_addr.byte);
else
-   rc = snprintf(str, ip_len, "%pI4\n",
+   rc = snprintf(buf, ip_len, "%pI4\n",
  block->target[idx].ipv4_addr.byte);
break;
case ISCSI_BOOT_TGT_PORT:
-   rc = snprintf(str, 12, "%d\n",
+   rc = snprintf(buf, 12, "%d\n",
  GET_FIELD2(block->target[idx].generic_cont0,
 NVM_ISCSI_CFG_TARGET_TCP_PORT));
break;
case ISCSI_BOOT_TGT_LUN:
-   rc = snprintf(str, 22, "%.*d\n",
+   rc = snprintf(buf, 22, "%.*d\n",
  block->

[PATCH v3 1/2] qedi: Fix truncation of CHAP name and secret

2018-02-07 Thread Nilesh Javali
From: Andrew Vasquez 

The data in NVRAM is not guaranteed to be NUL terminated.
Since snprintf expects byte-stream to accommodate null byte,
the CHAP secret is truncated.
Use sprintf instead of snprintf to fix the truncation of
CHAP name and secret.

Signed-off-by: Andrew Vasquez 
Signed-off-by: Nilesh Javali 
---
 drivers/scsi/qedi/qedi_main.c | 24 
 1 file changed, 12 insertions(+), 12 deletions(-)

diff --git a/drivers/scsi/qedi/qedi_main.c b/drivers/scsi/qedi/qedi_main.c
index 8808f0d..deaed93 100644
--- a/drivers/scsi/qedi/qedi_main.c
+++ b/drivers/scsi/qedi/qedi_main.c
@@ -1842,8 +1842,8 @@ static ssize_t qedi_show_boot_ini_info(void *data, int 
type, char *buf)
 
switch (type) {
case ISCSI_BOOT_INI_INITIATOR_NAME:
-   rc = snprintf(str, NVM_ISCSI_CFG_ISCSI_NAME_MAX_LEN, "%s\n",
- initiator->initiator_name.byte);
+   rc = sprintf(str, "%.*s\n", NVM_ISCSI_CFG_ISCSI_NAME_MAX_LEN,
+initiator->initiator_name.byte);
break;
default:
rc = 0;
@@ -1910,8 +1910,8 @@ static umode_t qedi_ini_get_attr_visibility(void *data, 
int type)
 
switch (type) {
case ISCSI_BOOT_TGT_NAME:
-   rc = snprintf(str, NVM_ISCSI_CFG_ISCSI_NAME_MAX_LEN, "%s\n",
- block->target[idx].target_name.byte);
+   rc = sprintf(str, "%.*s\n", NVM_ISCSI_CFG_ISCSI_NAME_MAX_LEN,
+block->target[idx].target_name.byte);
break;
case ISCSI_BOOT_TGT_IP_ADDR:
if (ipv6_en)
@@ -1932,20 +1932,20 @@ static umode_t qedi_ini_get_attr_visibility(void *data, 
int type)
  block->target[idx].lun.value[0]);
break;
case ISCSI_BOOT_TGT_CHAP_NAME:
-   rc = snprintf(str, NVM_ISCSI_CFG_CHAP_NAME_MAX_LEN, "%s\n",
- chap_name);
+   rc = sprintf(str, "%.*s\n", NVM_ISCSI_CFG_CHAP_NAME_MAX_LEN,
+chap_name);
break;
case ISCSI_BOOT_TGT_CHAP_SECRET:
-   rc = snprintf(str, NVM_ISCSI_CFG_CHAP_PWD_MAX_LEN, "%s\n",
- chap_secret);
+   rc = sprintf(str, "%.*s\n", NVM_ISCSI_CFG_CHAP_NAME_MAX_LEN,
+chap_secret);
break;
case ISCSI_BOOT_TGT_REV_CHAP_NAME:
-   rc = snprintf(str, NVM_ISCSI_CFG_CHAP_NAME_MAX_LEN, "%s\n",
- mchap_name);
+   rc = sprintf(str, "%.*s\n", NVM_ISCSI_CFG_CHAP_NAME_MAX_LEN,
+mchap_name);
break;
case ISCSI_BOOT_TGT_REV_CHAP_SECRET:
-   rc = snprintf(str, NVM_ISCSI_CFG_CHAP_PWD_MAX_LEN, "%s\n",
- mchap_secret);
+   rc = sprintf(str, "%.*s\n", NVM_ISCSI_CFG_CHAP_NAME_MAX_LEN,
+mchap_secret);
break;
case ISCSI_BOOT_TGT_FLAGS:
rc = snprintf(str, 3, "%hhd\n", SYSFS_FLAG_FW_SEL_BOOT);
-- 
1.8.3.1



[PATCH v3 0/2] Code cleanup and bug fix for truncated CHAP name and secret

2018-02-07 Thread Nilesh Javali
Martin,
Please consider below patch set for next 'scsi-fixes' submission.

Thanks,
Nilesh

Andrew Vasquez (1):
  qedi: Fix truncation of CHAP name and secret

Nilesh Javali (1):
  qedi: Cleanup local str variable

 drivers/scsi/qedi/qedi_main.c | 55 ---
 1 file changed, 26 insertions(+), 29 deletions(-)

-- 
1.8.3.1



[PATCH V2 1/2] qedi: Fix truncation of CHAP name and secret

2018-02-06 Thread Nilesh Javali
From: Andrew Vasquez 

The data in NVRAM is not guaranteed to be NUL terminated.
Copy the data upto the element size or to the first NUL
in the byte-stream and then append a NUL.

Signed-off-by: Andrew Vasquez 
Signed-off-by: Nilesh Javali 
---
 drivers/scsi/qedi/qedi_main.c | 45 +++
 1 file changed, 33 insertions(+), 12 deletions(-)

diff --git a/drivers/scsi/qedi/qedi_main.c b/drivers/scsi/qedi/qedi_main.c
index 8808f0d..f3dd438 100644
--- a/drivers/scsi/qedi/qedi_main.c
+++ b/drivers/scsi/qedi/qedi_main.c
@@ -1705,6 +1705,27 @@ void qedi_reset_host_mtu(struct qedi_ctx *qedi, u16 mtu)
qedi_ops->ll2->start(qedi->cdev, ¶ms);
 }
 
+static ssize_t
+qedi_show_copy_data(char *buf, size_t size, u8 *data)
+{
+   size_t i;
+
+   if (!data)
+   return sprintf(buf, "\n");
+
+   /*
+* Data not guaranteed to be NUL terminated. Copy until NUL found or
+* complete copy done.
+*/
+   for (i = 0; i < size && data[i]; i++)
+   buf[i] = data[i];
+
+   /* Data copy complete, append NEWLINE and NUL terminator. */
+   buf[i] = '\n';
+   buf[i + 1] = '\0';
+   return strlen(buf);
+}
+
 /**
  * qedi_get_nvram_block: - Scan through the iSCSI NVRAM block (while accounting
  * for gaps) for the matching absolute-pf-id of the QEDI device.
@@ -1842,8 +1863,8 @@ static ssize_t qedi_show_boot_ini_info(void *data, int 
type, char *buf)
 
switch (type) {
case ISCSI_BOOT_INI_INITIATOR_NAME:
-   rc = snprintf(str, NVM_ISCSI_CFG_ISCSI_NAME_MAX_LEN, "%s\n",
- initiator->initiator_name.byte);
+   rc = qedi_show_copy_data(str, NVM_ISCSI_CFG_ISCSI_NAME_MAX_LEN,
+initiator->initiator_name.byte);
break;
default:
rc = 0;
@@ -1910,8 +1931,8 @@ static umode_t qedi_ini_get_attr_visibility(void *data, 
int type)
 
switch (type) {
case ISCSI_BOOT_TGT_NAME:
-   rc = snprintf(str, NVM_ISCSI_CFG_ISCSI_NAME_MAX_LEN, "%s\n",
- block->target[idx].target_name.byte);
+   rc = qedi_show_copy_data(str, NVM_ISCSI_CFG_ISCSI_NAME_MAX_LEN,
+block->target[idx].target_name.byte);
break;
case ISCSI_BOOT_TGT_IP_ADDR:
if (ipv6_en)
@@ -1932,20 +1953,20 @@ static umode_t qedi_ini_get_attr_visibility(void *data, 
int type)
  block->target[idx].lun.value[0]);
break;
case ISCSI_BOOT_TGT_CHAP_NAME:
-   rc = snprintf(str, NVM_ISCSI_CFG_CHAP_NAME_MAX_LEN, "%s\n",
- chap_name);
+   rc = qedi_show_copy_data(str, NVM_ISCSI_CFG_CHAP_NAME_MAX_LEN,
+chap_name);
break;
case ISCSI_BOOT_TGT_CHAP_SECRET:
-   rc = snprintf(str, NVM_ISCSI_CFG_CHAP_PWD_MAX_LEN, "%s\n",
- chap_secret);
+   rc = qedi_show_copy_data(str, NVM_ISCSI_CFG_CHAP_PWD_MAX_LEN,
+chap_secret);
break;
case ISCSI_BOOT_TGT_REV_CHAP_NAME:
-   rc = snprintf(str, NVM_ISCSI_CFG_CHAP_NAME_MAX_LEN, "%s\n",
- mchap_name);
+   rc = qedi_show_copy_data(str, NVM_ISCSI_CFG_CHAP_NAME_MAX_LEN,
+mchap_name);
break;
case ISCSI_BOOT_TGT_REV_CHAP_SECRET:
-   rc = snprintf(str, NVM_ISCSI_CFG_CHAP_PWD_MAX_LEN, "%s\n",
- mchap_secret);
+   rc = qedi_show_copy_data(str, NVM_ISCSI_CFG_CHAP_PWD_MAX_LEN,
+mchap_secret);
break;
case ISCSI_BOOT_TGT_FLAGS:
rc = snprintf(str, 3, "%hhd\n", SYSFS_FLAG_FW_SEL_BOOT);
-- 
1.8.3.1



[PATCH 2/2] qedi: Cleanup local str variable

2018-02-06 Thread Nilesh Javali
Signed-off-by: Nilesh Javali 
---
 drivers/scsi/qedi/qedi_main.c | 43 ---
 1 file changed, 20 insertions(+), 23 deletions(-)

diff --git a/drivers/scsi/qedi/qedi_main.c b/drivers/scsi/qedi/qedi_main.c
index f3dd438..701bc72 100644
--- a/drivers/scsi/qedi/qedi_main.c
+++ b/drivers/scsi/qedi/qedi_main.c
@@ -1756,7 +1756,6 @@ static ssize_t qedi_show_boot_eth_info(void *data, int 
type, char *buf)
 {
struct qedi_ctx *qedi = data;
struct nvm_iscsi_initiator *initiator;
-   char *str = buf;
int rc = 1;
u32 ipv6_en, dhcp_en, ip_len;
struct nvm_iscsi_block *block;
@@ -1790,32 +1789,32 @@ static ssize_t qedi_show_boot_eth_info(void *data, int 
type, char *buf)
 
switch (type) {
case ISCSI_BOOT_ETH_IP_ADDR:
-   rc = snprintf(str, ip_len, fmt, ip);
+   rc = snprintf(buf, ip_len, fmt, ip);
break;
case ISCSI_BOOT_ETH_SUBNET_MASK:
-   rc = snprintf(str, ip_len, fmt, sub);
+   rc = snprintf(buf, ip_len, fmt, sub);
break;
case ISCSI_BOOT_ETH_GATEWAY:
-   rc = snprintf(str, ip_len, fmt, gw);
+   rc = snprintf(buf, ip_len, fmt, gw);
break;
case ISCSI_BOOT_ETH_FLAGS:
-   rc = snprintf(str, 3, "%hhd\n",
+   rc = snprintf(buf, 3, "%hhd\n",
  SYSFS_FLAG_FW_SEL_BOOT);
break;
case ISCSI_BOOT_ETH_INDEX:
-   rc = snprintf(str, 3, "0\n");
+   rc = snprintf(buf, 3, "0\n");
break;
case ISCSI_BOOT_ETH_MAC:
-   rc = sysfs_format_mac(str, qedi->mac, ETH_ALEN);
+   rc = sysfs_format_mac(buf, qedi->mac, ETH_ALEN);
break;
case ISCSI_BOOT_ETH_VLAN:
-   rc = snprintf(str, 12, "%d\n",
+   rc = snprintf(buf, 12, "%d\n",
  GET_FIELD2(initiator->generic_cont0,
 NVM_ISCSI_CFG_INITIATOR_VLAN));
break;
case ISCSI_BOOT_ETH_ORIGIN:
if (dhcp_en)
-   rc = snprintf(str, 3, "3\n");
+   rc = snprintf(buf, 3, "3\n");
break;
default:
rc = 0;
@@ -1851,7 +1850,6 @@ static ssize_t qedi_show_boot_ini_info(void *data, int 
type, char *buf)
 {
struct qedi_ctx *qedi = data;
struct nvm_iscsi_initiator *initiator;
-   char *str = buf;
int rc;
struct nvm_iscsi_block *block;
 
@@ -1863,7 +1861,7 @@ static ssize_t qedi_show_boot_ini_info(void *data, int 
type, char *buf)
 
switch (type) {
case ISCSI_BOOT_INI_INITIATOR_NAME:
-   rc = qedi_show_copy_data(str, NVM_ISCSI_CFG_ISCSI_NAME_MAX_LEN,
+   rc = qedi_show_copy_data(buf, NVM_ISCSI_CFG_ISCSI_NAME_MAX_LEN,
 initiator->initiator_name.byte);
break;
default:
@@ -1892,7 +1890,6 @@ static umode_t qedi_ini_get_attr_visibility(void *data, 
int type)
 qedi_show_boot_tgt_info(struct qedi_ctx *qedi, int type,
char *buf, enum qedi_nvm_tgts idx)
 {
-   char *str = buf;
int rc = 1;
u32 ctrl_flags, ipv6_en, chap_en, mchap_en, ip_len;
struct nvm_iscsi_block *block;
@@ -1931,48 +1928,48 @@ static umode_t qedi_ini_get_attr_visibility(void *data, 
int type)
 
switch (type) {
case ISCSI_BOOT_TGT_NAME:
-   rc = qedi_show_copy_data(str, NVM_ISCSI_CFG_ISCSI_NAME_MAX_LEN,
+   rc = qedi_show_copy_data(buf, NVM_ISCSI_CFG_ISCSI_NAME_MAX_LEN,
 block->target[idx].target_name.byte);
break;
case ISCSI_BOOT_TGT_IP_ADDR:
if (ipv6_en)
-   rc = snprintf(str, ip_len, "%pI6\n",
+   rc = snprintf(buf, ip_len, "%pI6\n",
  block->target[idx].ipv6_addr.byte);
else
-   rc = snprintf(str, ip_len, "%pI4\n",
+   rc = snprintf(buf, ip_len, "%pI4\n",
  block->target[idx].ipv4_addr.byte);
break;
case ISCSI_BOOT_TGT_PORT:
-   rc = snprintf(str, 12, "%d\n",
+   rc = snprintf(buf, 12, "%d\n",
  GET_FIELD2(block->target[idx].generic_cont0,
 NVM_ISCSI_CFG_TARGET_TCP_PORT));
break;
case ISCSI_BOOT_TGT_LUN:
-   rc = snprintf(str, 22, "%.*d\n",
+   rc = snprintf(buf, 22, "%.*d\n",
  block->target[id

[PATCH 0/2] Code cleanup and bug fix for truncated CHAP name and secret

2018-02-06 Thread Nilesh Javali
Bart, Lee,
This patch set consists of v2 solution for the bug fix for CHAP name and secret.
Please review and let know the comments.

Martin,
Please consider below patch set for next 'scsi-fixes' submission.

Thanks,
Nilesh

Andrew Vasquez (1):
  qedi: Fix truncation of CHAP name and secret

Nilesh Javali (1):
  qedi: Cleanup local str variable

 drivers/scsi/qedi/qedi_main.c | 76 ++-
 1 file changed, 47 insertions(+), 29 deletions(-)

-- 
1.8.3.1



[PATCH] qedi: Fix truncation of name and secret

2018-01-31 Thread Nilesh Javali
Adjust the NULL byte added by snprintf.

Signed-off-by: Nilesh Javali 
---
 drivers/scsi/qedi/qedi_main.c | 12 ++--
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/drivers/scsi/qedi/qedi_main.c b/drivers/scsi/qedi/qedi_main.c
index 34a..cf8badb 100644
--- a/drivers/scsi/qedi/qedi_main.c
+++ b/drivers/scsi/qedi/qedi_main.c
@@ -1840,7 +1840,7 @@ static ssize_t qedi_show_boot_ini_info(void *data, int 
type, char *buf)
 
switch (type) {
case ISCSI_BOOT_INI_INITIATOR_NAME:
-   rc = snprintf(str, NVM_ISCSI_CFG_ISCSI_NAME_MAX_LEN, "%s\n",
+   rc = snprintf(str, NVM_ISCSI_CFG_ISCSI_NAME_MAX_LEN + 1, "%s",
  initiator->initiator_name.byte);
break;
default:
@@ -1908,7 +1908,7 @@ static umode_t qedi_ini_get_attr_visibility(void *data, 
int type)
 
switch (type) {
case ISCSI_BOOT_TGT_NAME:
-   rc = snprintf(str, NVM_ISCSI_CFG_ISCSI_NAME_MAX_LEN, "%s\n",
+   rc = snprintf(str, NVM_ISCSI_CFG_ISCSI_NAME_MAX_LEN + 1, "%s",
  block->target[idx].target_name.byte);
break;
case ISCSI_BOOT_TGT_IP_ADDR:
@@ -1930,19 +1930,19 @@ static umode_t qedi_ini_get_attr_visibility(void *data, 
int type)
  block->target[idx].lun.value[0]);
break;
case ISCSI_BOOT_TGT_CHAP_NAME:
-   rc = snprintf(str, NVM_ISCSI_CFG_CHAP_NAME_MAX_LEN, "%s\n",
+   rc = snprintf(str, NVM_ISCSI_CFG_CHAP_NAME_MAX_LEN + 1, "%s",
  chap_name);
break;
case ISCSI_BOOT_TGT_CHAP_SECRET:
-   rc = snprintf(str, NVM_ISCSI_CFG_CHAP_PWD_MAX_LEN, "%s\n",
+   rc = snprintf(str, NVM_ISCSI_CFG_CHAP_PWD_MAX_LEN + 1, "%s",
  chap_secret);
break;
case ISCSI_BOOT_TGT_REV_CHAP_NAME:
-   rc = snprintf(str, NVM_ISCSI_CFG_CHAP_NAME_MAX_LEN, "%s\n",
+   rc = snprintf(str, NVM_ISCSI_CFG_CHAP_NAME_MAX_LEN + 1, "%s",
  mchap_name);
break;
case ISCSI_BOOT_TGT_REV_CHAP_SECRET:
-   rc = snprintf(str, NVM_ISCSI_CFG_CHAP_PWD_MAX_LEN, "%s\n",
+   rc = snprintf(str, NVM_ISCSI_CFG_CHAP_PWD_MAX_LEN + 1, "%s",
  mchap_secret);
break;
case ISCSI_BOOT_TGT_FLAGS:
-- 
1.8.3.1



[PATCH] qedi: Add ISCSI_BOOT_SYSFS to Kconfig

2017-07-19 Thread Nilesh Javali
qedi uses iscsi_boot_sysfs to export the targets used
for boot to sysfs. Select the config option to make sure
the module is built.

This addresses the compile time issue,
drivers/scsi/qedi/qedi_main.o: In function `qedi_remove':
qedi_main.c:(.text+0x3bbd): undefined reference to `iscsi_boot_destroy_kset'
drivers/scsi/qedi/qedi_main.o: In function `__qedi_probe.constprop.0':
qedi_main.c:(.text+0x577a): undefined reference to 
`iscsi_boot_create_target'
qedi_main.c:(.text+0x5807): undefined reference to 
`iscsi_boot_create_target'
qedi_main.c:(.text+0x587f): undefined reference to 
`iscsi_boot_create_initiator'
qedi_main.c:(.text+0x58f3): undefined reference to 
`iscsi_boot_create_ethernet'
qedi_main.c:(.text+0x5927): undefined reference to `iscsi_boot_destroy_kset'
qedi_main.c:(.text+0x5d7b): undefined reference to 
`iscsi_boot_create_host_kset'

Signed-off-by: Nilesh Javali 
---
 drivers/scsi/qedi/Kconfig | 1 +
 1 file changed, 1 insertion(+)

diff --git a/drivers/scsi/qedi/Kconfig b/drivers/scsi/qedi/Kconfig
index 2133145..6f3773f 100644
--- a/drivers/scsi/qedi/Kconfig
+++ b/drivers/scsi/qedi/Kconfig
@@ -5,6 +5,7 @@ config QEDI
select SCSI_ISCSI_ATTRS
select QED_LL2
select QED_ISCSI
+select ISCSI_BOOT_SYSFS
---help---
This driver supports iSCSI offload for the QLogic FastLinQ
41000 Series Converged Network Adapters.
-- 
1.8.3.1



[PATCH v1 1/1] qedi: Add support for Boot from SAN over iSCSI offload

2017-06-27 Thread Nilesh Javali
This patch adds support for Boot from SAN over iSCSI offload.
The iSCSI boot information in the NVRAM is populated under
/sys/firmware/iscsi_bootX/ using qed NVM-image reading API and
further exported to open-iscsi to perform iSCSI login enabling
boot over offload iSCSI interface in a Boot from SAN environment.

The dependent qed patches for this support are,
- qed: Support NVM-image reading API
- qed: Share additional information with qedf

Signed-off-by: Arun Easi 
Signed-off-by: Andrew Vasquez 
Signed-off-by: Manish Rangankar 
Signed-off-by: Nilesh Javali 
---
 drivers/scsi/qedi/qedi.h   |  17 ++
 drivers/scsi/qedi/qedi_main.c  | 419 +
 drivers/scsi/qedi/qedi_nvm_iscsi_cfg.h | 210 +
 3 files changed, 646 insertions(+)
 create mode 100644 drivers/scsi/qedi/qedi_nvm_iscsi_cfg.h

diff --git a/drivers/scsi/qedi/qedi.h b/drivers/scsi/qedi/qedi.h
index 32632c9..91d2f51 100644
--- a/drivers/scsi/qedi/qedi.h
+++ b/drivers/scsi/qedi/qedi.h
@@ -23,11 +23,17 @@
 #include 
 #include 
 #include "qedi_version.h"
+#include "qedi_nvm_iscsi_cfg.h"
 
 #define QEDI_MODULE_NAME   "qedi"
 
 struct qedi_endpoint;
 
+#ifndef GET_FIELD2
+#define GET_FIELD2(value, name) \
+   (((value) & (name ## _MASK)) >> (name ## _OFFSET))
+#endif
+
 /*
  * PCI function probe defines
  */
@@ -66,6 +72,11 @@
 #define QEDI_HW_DMA_BOUNDARY   0xfff
 #define QEDI_PATH_HANDLE   0xFE000UL
 
+enum qedi_nvm_tgts {
+   QEDI_NVM_TGT_PRI,
+   QEDI_NVM_TGT_SEC,
+};
+
 struct qedi_uio_ctrl {
/* meta data */
u32 uio_hsi_version;
@@ -283,6 +294,8 @@ struct qedi_ctx {
void *bdq_pbl_list;
dma_addr_t bdq_pbl_list_dma;
u8 bdq_pbl_list_num_entries;
+   struct nvm_iscsi_cfg *iscsi_cfg;
+   dma_addr_t nvm_buf_dma;
void __iomem *bdq_primary_prod;
void __iomem *bdq_secondary_prod;
u16 bdq_prod_idx;
@@ -337,6 +350,10 @@ struct qedi_ctx {
bool use_fast_sge;
 
atomic_t num_offloads;
+#define SYSFS_FLAG_FW_SEL_BOOT 2
+#define IPV6_LEN   41
+#define IPV4_LEN   17
+   struct iscsi_boot_kset *boot_kset;
 };
 
 struct qedi_work {
diff --git a/drivers/scsi/qedi/qedi_main.c b/drivers/scsi/qedi/qedi_main.c
index 09a2946..f07ac1c 100644
--- a/drivers/scsi/qedi/qedi_main.c
+++ b/drivers/scsi/qedi/qedi_main.c
@@ -19,6 +19,7 @@
 #include 
 #include 
 #include 
+#include 
 
 #include 
 #include 
@@ -1143,6 +1144,30 @@ static int qedi_setup_int(struct qedi_ctx *qedi)
return rc;
 }
 
+static void qedi_free_nvm_iscsi_cfg(struct qedi_ctx *qedi)
+{
+   if (qedi->iscsi_cfg)
+   dma_free_coherent(&qedi->pdev->dev,
+ sizeof(struct nvm_iscsi_cfg),
+ qedi->iscsi_cfg, qedi->nvm_buf_dma);
+}
+
+static int qedi_alloc_nvm_iscsi_cfg(struct qedi_ctx *qedi)
+{
+   qedi->iscsi_cfg = dma_zalloc_coherent(&qedi->pdev->dev,
+sizeof(struct nvm_iscsi_cfg),
+&qedi->nvm_buf_dma, GFP_KERNEL);
+   if (!qedi->iscsi_cfg) {
+   QEDI_ERR(&qedi->dbg_ctx, "Could not allocate NVM BUF.\n");
+   return -ENOMEM;
+   }
+   QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_INFO,
+ "NVM BUF addr=0x%p dma=0x%llx.\n", qedi->iscsi_cfg,
+ qedi->nvm_buf_dma);
+
+   return 0;
+}
+
 static void qedi_free_bdq(struct qedi_ctx *qedi)
 {
int i;
@@ -1183,6 +1208,7 @@ static void qedi_free_global_queues(struct qedi_ctx *qedi)
kfree(gl[i]);
}
qedi_free_bdq(qedi);
+   qedi_free_nvm_iscsi_cfg(qedi);
 }
 
 static int qedi_alloc_bdq(struct qedi_ctx *qedi)
@@ -1309,6 +1335,11 @@ static int qedi_alloc_global_queues(struct qedi_ctx 
*qedi)
if (rc)
goto mem_alloc_failure;
 
+   /* Allocate DMA coherent buffers for NVM_ISCSI_CFG */
+   rc = qedi_alloc_nvm_iscsi_cfg(qedi);
+   if (rc)
+   goto mem_alloc_failure;
+
/* Allocate a CQ and an associated PBL for each MSI-X
 * vector.
 */
@@ -1673,6 +1704,387 @@ void qedi_reset_host_mtu(struct qedi_ctx *qedi, u16 mtu)
qedi_ops->ll2->start(qedi->cdev, ¶ms);
 }
 
+/**
+ * qedi_get_nvram_block: - Scan through the iSCSI NVRAM block (while accounting
+ * for gaps) for the matching absolute-pf-id of the QEDI device.
+ */
+static struct nvm_iscsi_block *
+qedi_get_nvram_block(struct qedi_ctx *qedi)
+{
+   int i;
+   u8 pf;
+   u32 flags;
+   struct nvm_iscsi_block *block;
+
+   pf = qedi->dev_info.common.abs_pf_id;
+   block = &qedi->iscsi_cfg->block[0];
+   for (i = 0; i < NUM_OF_ISCSI_PF_SUPPORTED; i++, block++) {
+   flags = ((block->id) & NVM_ISCSI_CF

[PATCH 1/1] qedi: Add support for offload iSCSI Boot

2017-06-19 Thread Nilesh Javali
This patch adds support for offload iSCSI boot (Boot from SAN
over iSCSI offload).

The dependent qed patches for this support are,
- qed: Support NVM-image reading API
- qed: Share additional information with qedf

Signed-off-by: Arun Easi 
Signed-off-by: Andrew Vasquez 
Signed-off-by: Manish Rangankar 
Signed-off-by: Nilesh Javali 
---
 drivers/scsi/qedi/qedi.h   |  17 ++
 drivers/scsi/qedi/qedi_main.c  | 419 +
 drivers/scsi/qedi/qedi_nvm_iscsi_cfg.h | 210 +
 3 files changed, 646 insertions(+)
 create mode 100644 drivers/scsi/qedi/qedi_nvm_iscsi_cfg.h

diff --git a/drivers/scsi/qedi/qedi.h b/drivers/scsi/qedi/qedi.h
index 32632c9..91d2f51 100644
--- a/drivers/scsi/qedi/qedi.h
+++ b/drivers/scsi/qedi/qedi.h
@@ -23,11 +23,17 @@
 #include 
 #include 
 #include "qedi_version.h"
+#include "qedi_nvm_iscsi_cfg.h"
 
 #define QEDI_MODULE_NAME   "qedi"
 
 struct qedi_endpoint;
 
+#ifndef GET_FIELD2
+#define GET_FIELD2(value, name) \
+   (((value) & (name ## _MASK)) >> (name ## _OFFSET))
+#endif
+
 /*
  * PCI function probe defines
  */
@@ -66,6 +72,11 @@
 #define QEDI_HW_DMA_BOUNDARY   0xfff
 #define QEDI_PATH_HANDLE   0xFE000UL
 
+enum qedi_nvm_tgts {
+   QEDI_NVM_TGT_PRI,
+   QEDI_NVM_TGT_SEC,
+};
+
 struct qedi_uio_ctrl {
/* meta data */
u32 uio_hsi_version;
@@ -283,6 +294,8 @@ struct qedi_ctx {
void *bdq_pbl_list;
dma_addr_t bdq_pbl_list_dma;
u8 bdq_pbl_list_num_entries;
+   struct nvm_iscsi_cfg *iscsi_cfg;
+   dma_addr_t nvm_buf_dma;
void __iomem *bdq_primary_prod;
void __iomem *bdq_secondary_prod;
u16 bdq_prod_idx;
@@ -337,6 +350,10 @@ struct qedi_ctx {
bool use_fast_sge;
 
atomic_t num_offloads;
+#define SYSFS_FLAG_FW_SEL_BOOT 2
+#define IPV6_LEN   41
+#define IPV4_LEN   17
+   struct iscsi_boot_kset *boot_kset;
 };
 
 struct qedi_work {
diff --git a/drivers/scsi/qedi/qedi_main.c b/drivers/scsi/qedi/qedi_main.c
index 09a2946..f07ac1c 100644
--- a/drivers/scsi/qedi/qedi_main.c
+++ b/drivers/scsi/qedi/qedi_main.c
@@ -19,6 +19,7 @@
 #include 
 #include 
 #include 
+#include 
 
 #include 
 #include 
@@ -1143,6 +1144,30 @@ static int qedi_setup_int(struct qedi_ctx *qedi)
return rc;
 }
 
+static void qedi_free_nvm_iscsi_cfg(struct qedi_ctx *qedi)
+{
+   if (qedi->iscsi_cfg)
+   dma_free_coherent(&qedi->pdev->dev,
+ sizeof(struct nvm_iscsi_cfg),
+ qedi->iscsi_cfg, qedi->nvm_buf_dma);
+}
+
+static int qedi_alloc_nvm_iscsi_cfg(struct qedi_ctx *qedi)
+{
+   qedi->iscsi_cfg = dma_zalloc_coherent(&qedi->pdev->dev,
+sizeof(struct nvm_iscsi_cfg),
+&qedi->nvm_buf_dma, GFP_KERNEL);
+   if (!qedi->iscsi_cfg) {
+   QEDI_ERR(&qedi->dbg_ctx, "Could not allocate NVM BUF.\n");
+   return -ENOMEM;
+   }
+   QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_INFO,
+ "NVM BUF addr=0x%p dma=0x%llx.\n", qedi->iscsi_cfg,
+ qedi->nvm_buf_dma);
+
+   return 0;
+}
+
 static void qedi_free_bdq(struct qedi_ctx *qedi)
 {
int i;
@@ -1183,6 +1208,7 @@ static void qedi_free_global_queues(struct qedi_ctx *qedi)
kfree(gl[i]);
}
qedi_free_bdq(qedi);
+   qedi_free_nvm_iscsi_cfg(qedi);
 }
 
 static int qedi_alloc_bdq(struct qedi_ctx *qedi)
@@ -1309,6 +1335,11 @@ static int qedi_alloc_global_queues(struct qedi_ctx 
*qedi)
if (rc)
goto mem_alloc_failure;
 
+   /* Allocate DMA coherent buffers for NVM_ISCSI_CFG */
+   rc = qedi_alloc_nvm_iscsi_cfg(qedi);
+   if (rc)
+   goto mem_alloc_failure;
+
/* Allocate a CQ and an associated PBL for each MSI-X
 * vector.
 */
@@ -1673,6 +1704,387 @@ void qedi_reset_host_mtu(struct qedi_ctx *qedi, u16 mtu)
qedi_ops->ll2->start(qedi->cdev, ¶ms);
 }
 
+/**
+ * qedi_get_nvram_block: - Scan through the iSCSI NVRAM block (while accounting
+ * for gaps) for the matching absolute-pf-id of the QEDI device.
+ */
+static struct nvm_iscsi_block *
+qedi_get_nvram_block(struct qedi_ctx *qedi)
+{
+   int i;
+   u8 pf;
+   u32 flags;
+   struct nvm_iscsi_block *block;
+
+   pf = qedi->dev_info.common.abs_pf_id;
+   block = &qedi->iscsi_cfg->block[0];
+   for (i = 0; i < NUM_OF_ISCSI_PF_SUPPORTED; i++, block++) {
+   flags = ((block->id) & NVM_ISCSI_CFG_BLK_CTRL_FLAG_MASK) >>
+   NVM_ISCSI_CFG_BLK_CTRL_FLAG_OFFSET;
+   if (flags & (NVM_ISCSI_CFG_BLK_CTRL_FLAG_IS_NOT_EMPTY |
+   NVM_ISCSI_CFG_BLK_CTRL_FLAG_PF_

[PATCH 0/1] qedi: Add iSCSI Boot-from-SAN support

2017-06-19 Thread Nilesh Javali
Martin,

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

Thanks,
Nilesh

Nilesh Javali (1):
  qedi: Add support for offload iSCSI Boot

 drivers/scsi/qedi/qedi.h   |  17 ++
 drivers/scsi/qedi/qedi_main.c  | 419 +
 drivers/scsi/qedi/qedi_nvm_iscsi_cfg.h | 210 +
 3 files changed, 646 insertions(+)
 create mode 100644 drivers/scsi/qedi/qedi_nvm_iscsi_cfg.h

-- 
1.8.3.1



Re: [PATCH] [SCSI] qla4xxx: mark symbols static where possible

2016-09-01 Thread Nilesh Javali


On 29/08/16 4:16 PM, "Baoyou Xie"  wrote:

>We get 1 warning when build kernel with W=1:
>drivers/scsi/qla4xxx/ql4_nx.c:1846:10: warning: no previous prototype for
>'ql4_84xx_ipmdio_rd_reg' [-Wmissing-prototypes]
>
>In fact, this function is only used in the file in which it is
>declared and don't need a declaration, but can be made static.
>so this patch marks this function with 'static'.
>
>Signed-off-by: Baoyou Xie 
>---
> drivers/scsi/qla4xxx/ql4_nx.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
>diff --git a/drivers/scsi/qla4xxx/ql4_nx.c b/drivers/scsi/qla4xxx/ql4_nx.c
>index ae87d6c..06ddd13 100644
>--- a/drivers/scsi/qla4xxx/ql4_nx.c
>+++ b/drivers/scsi/qla4xxx/ql4_nx.c
>@@ -1843,7 +1843,7 @@ static uint32_t ql4_84xx_poll_wait_for_ready(struct
>scsi_qla_host *ha,
>   return rval;
> }
> 
>-uint32_t ql4_84xx_ipmdio_rd_reg(struct scsi_qla_host *ha, uint32_t addr1,
>+static uint32_t ql4_84xx_ipmdio_rd_reg(struct scsi_qla_host *ha,
>uint32_t addr1,
>   uint32_t addr3, uint32_t mask, uint32_t addr,
>   uint32_t *data_ptr)
> {
>-- 
>2.7.4


Acked-by: Nilesh Javali 

--
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


Re: [patch] bnx2i: silence uninitialized variable warnings

2016-04-17 Thread Nilesh Javali


On 14/04/16 3:10 PM, "Dan Carpenter"  wrote:

>Presumably it isn't possible to have empty lists here, but my static
>checker doesn't know that and complains that "ep" can be used
>uninitialized.
>
>Signed-off-by: Dan Carpenter 
>
>diff --git a/drivers/scsi/bnx2i/bnx2i_iscsi.c
>b/drivers/scsi/bnx2i/bnx2i_iscsi.c
>index 7289437..133901f 100644
>--- a/drivers/scsi/bnx2i/bnx2i_iscsi.c
>+++ b/drivers/scsi/bnx2i/bnx2i_iscsi.c
>@@ -675,7 +675,7 @@ bnx2i_find_ep_in_ofld_list(struct bnx2i_hba *hba, u32
>iscsi_cid)
> {
>   struct list_head *list;
>   struct list_head *tmp;
>-  struct bnx2i_endpoint *ep;
>+  struct bnx2i_endpoint *ep = NULL;
> 
>   read_lock_bh(&hba->ep_rdwr_lock);
>   list_for_each_safe(list, tmp, &hba->ep_ofld_list) {
>@@ -703,7 +703,7 @@ bnx2i_find_ep_in_destroy_list(struct bnx2i_hba *hba,
>u32 iscsi_cid)
> {
>   struct list_head *list;
>   struct list_head *tmp;
>-  struct bnx2i_endpoint *ep;
>+  struct bnx2i_endpoint *ep = NULL;
> 
>   read_lock_bh(&hba->ep_rdwr_lock);
>   list_for_each_safe(list, tmp, &hba->ep_destroy_list) {

Acked-by: Nilesh Javali 

--
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


Re: [PATCH 5/7] scsi: qla4xxx: shut up warning for rd_reg_indirect

2016-02-01 Thread Nilesh Javali


On 27/01/16 9:27 PM, "Arnd Bergmann"  wrote:

>The qla4_83xx_rd_reg_indirect() function can fail when it is unable
>to read a register, but not all callers check its return value before
>using the register data, and gcc correctly warns about this:
>
>qla4xxx/ql4_83xx.c: In function 'qla4_83xx_process_reset_template':
>qla4xxx/ql4_83xx.c:1073:36: warning: 'value' may be used uninitialized in
>this function
> ha->reset_tmplt.array[index++] = value;
>^
>qla4xxx/ql4_83xx.c:1050:11: note: 'value' was declared here
>  uint32_t value;
>   ^
>qla4xxx/ql4_83xx.c:902:8: warning: 'value' may be used uninitialized in
>this function
>  value &= p_rmw_hdr->test_mask;
>^
>qla4xxx/ql4_83xx.c:895:11: note: 'value' was declared here
>  uint32_t value;
>   ^
>In file included from ../include/linux/io.h:25:0,
> from ../include/linux/pci.h:31,
> from ../drivers/scsi/qla4xxx/ql4_def.h:16,
> from ../drivers/scsi/qla4xxx/ql4_83xx.c:10:
>asm/io.h:101:2: warning: 'value' may be used uninitialized in this
>function
>  asm volatile("str %1, %0"
>  ^
>qla4xxx/ql4_83xx.c:874:11: note: 'value' was declared here
>  uint32_t value;
>   ^
>
>Unfortunately, I don't see any helpful way to add proper error handling
>for this case, and the failure scenario for rd_reg seems rather obscure,
>so this bails out and makes the rd_reg accessor set the result to
>0x
>so we at least get a predictable value.
>
>Signed-off-by: Arnd Bergmann 
>---
> drivers/scsi/qla4xxx/ql4_83xx.c | 6 --
> 1 file changed, 4 insertions(+), 2 deletions(-)
>
>diff --git a/drivers/scsi/qla4xxx/ql4_83xx.c
>b/drivers/scsi/qla4xxx/ql4_83xx.c
>index 5d4f8e67fb25..638f72c5ab05 100644
>--- a/drivers/scsi/qla4xxx/ql4_83xx.c
>+++ b/drivers/scsi/qla4xxx/ql4_83xx.c
>@@ -46,11 +46,13 @@ int qla4_83xx_rd_reg_indirect(struct scsi_qla_host
>*ha, uint32_t addr,
> 
>   ret_val = qla4_83xx_set_win_base(ha, addr);
> 
>-  if (ret_val == QLA_SUCCESS)
>+  if (ret_val == QLA_SUCCESS) {
>   *data = qla4_83xx_rd_reg(ha, QLA83XX_WILDCARD);
>-  else
>+  } else {
>+  *data = 0x;
>   ql4_printk(KERN_ERR, ha, "%s: failed read of addr 0x%x!\n",
>  __func__, addr);
>+  }
> 
>   return ret_val;
> }
>-- 
>2.7.0
>

Acked-by: Nilesh Javali 


--
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


RE: [PATCH] qla4xxx: pass timeout as HZ independent value

2015-06-07 Thread Nilesh Javali

> -Original Message-
> From: Nicholas Mc Guire [mailto:hof...@osadl.org]
> Sent: Thursday, May 28, 2015 1:40 AM
> To: Dept-Eng QLogic Storage Upstream
> Cc: James E.J. Bottomley; linux-scsi; linux-kernel; Nicholas Mc Guire
> Subject: [PATCH] qla4xxx: pass timeout as HZ independent value
> 
> schedule_timeout_* takes a timeout in jiffies but the code currently is
> passing in a constant which makes this timeout HZ dependent, so pass it
> through msecs_to_jiffies() to fix this up.
> 
> patch was compile tested with x86_64_defconfig + SCSI_LOWLEVEL=y,
> CONFIG_SCSI_QLA_ISCSI=m
> 
> Patch is against 4.1-rc5 (localversion-next is -next-20150527)
> 
> Signed-off-by: Nicholas Mc Guire 
> ---
> 
> As there is no documentation of the intended timeout it might be wrong to
> convert it with msecs_to_jiffies as this can reduces the actual jiffies value 
> by
> at least a factor of 10 - so someone that knows this driver needs to check on
> the actual value - but in any case it needs to be passed in a HZ independent
> way.
> 
>  drivers/scsi/qla4xxx/ql4_nx.c |2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/drivers/scsi/qla4xxx/ql4_nx.c b/drivers/scsi/qla4xxx/ql4_nx.c
> index 7c33658..7b53eab 100644
> --- a/drivers/scsi/qla4xxx/ql4_nx.c
> +++ b/drivers/scsi/qla4xxx/ql4_nx.c
> @@ -1569,7 +1569,7 @@ static int qla4_82xx_cmdpeg_ready(struct
> scsi_qla_host *ha, int pegtune_val)
>   (val == PHAN_INITIALIZE_ACK))
>   return 0;
>   set_current_state(TASK_UNINTERRUPTIBLE);
> - schedule_timeout(500);
> +     schedule_timeout(msecs_to_jiffies(500));
> 
>   } while (--retries);
> 
> --
> 1.7.10.4

Acked-by: Nilesh Javali 
<>

RE: [PATCH] scsi: unnecessary double init_completion removed

2014-12-31 Thread Nilesh Javali
Acked-by: Nilesh Javali 

I will send the maintainer list update patch.

Thanks,
Nilesh

-Original Message-
From: Nicholas Mc Guire [mailto:der.h...@hofr.at] 
Sent: Tuesday, December 23, 2014 11:30 PM
To: James E.J. Bottomley
Cc: Dept-Eng iSCSI Driver; linux-scsi; linux-kernel; Nicholas Mc Guire
Subject: [PATCH] scsi: unnecessary double init_completion removed

The double call to init_completion(&ha->disable_acb_comp); looks like an 
editing mistake only - dropped.

patch is against 3.18.0 linux-next

scripts/get_maintainer.pl -f drivers/scsi/qla4xxx/ql4_os.c returned Vikas 
Chaudhary  (supporter:QLOGIC QLA4XXX iS...) but 
that no longer seems to be a valid e-mail address.

Signed-off-by: Nicholas Mc Guire 
---
 drivers/scsi/qla4xxx/ql4_os.c |1 -
 1 file changed, 1 deletion(-)

diff --git a/drivers/scsi/qla4xxx/ql4_os.c b/drivers/scsi/qla4xxx/ql4_os.c 
index 6d25879..0c1da76 100644
--- a/drivers/scsi/qla4xxx/ql4_os.c
+++ b/drivers/scsi/qla4xxx/ql4_os.c
@@ -8672,7 +8672,6 @@ static int qla4xxx_probe_adapter(struct pci_dev *pdev,
init_completion(&ha->disable_acb_comp);
init_completion(&ha->idc_comp);
init_completion(&ha->link_up_comp);
-   init_completion(&ha->disable_acb_comp);

spin_lock_init(&ha->hardware_lock);
spin_lock_init(&ha->work_lock);
--
1.7.10.4

<>

RE: [PATCH] qla4xxx: check the return value of dma_alloc_coherent()

2014-07-29 Thread Nilesh Javali
Acked-By: Nilesh Javali 


-Original Message-
From: Maurizio Lombardi [mailto:mlomb...@redhat.com] 
Sent: Monday, July 28, 2014 6:25 PM
To: Vikas Chaudhary
Cc: Dept-Eng iSCSI Driver; linux-scsi; james.bottom...@hansenpartnership.com; 
h...@lst.de
Subject: [PATCH] qla4xxx: check the return value of dma_alloc_coherent()

the qla4xxx_alloc_fw_dump() calls dma_alloc_coherent() but does not
check its return value.

Signed-off-by: Maurizio Lombardi 
---
 drivers/scsi/qla4xxx/ql4_init.c | 6 ++
 1 file changed, 6 insertions(+)

diff --git a/drivers/scsi/qla4xxx/ql4_init.c b/drivers/scsi/qla4xxx/ql4_init.c
index 6f12f85..4180d6d 100644
--- a/drivers/scsi/qla4xxx/ql4_init.c
+++ b/drivers/scsi/qla4xxx/ql4_init.c
@@ -334,6 +334,12 @@ void qla4xxx_alloc_fw_dump(struct scsi_qla_host *ha)
/* Allocate memory for saving the template */
md_tmp = dma_alloc_coherent(&ha->pdev->dev, ha->fw_dump_tmplt_size,
&md_tmp_dma, GFP_KERNEL);
+   if (!md_tmp) {
+   ql4_printk(KERN_INFO, ha,
+  "scsi%ld: Failed to allocate DMA memory\n",
+  ha->host_no);
+   return;
+   }
 
/* Request template */
status =  qla4xxx_get_minidump_template(ha, md_tmp_dma);
-- 
Maurizio Lombardi

<>

RE: [PATCH] scsi: qla4xxx: ql4_mbx.c: Cleaning up missing null-terminate in conjunction with strncpy

2014-07-29 Thread Nilesh Javali
Acked-By: Nilesh Javali 


-Original Message-
From: Rickard Strandqvist [mailto:rickard_strandqv...@spectrumdigital.se] 
Sent: Sunday, July 27, 2014 8:28 PM
To: Vikas Chaudhary; Dept-Eng iSCSI Driver
Cc: Rickard Strandqvist; James E.J. Bottomley; linux-scsi; linux-kernel
Subject: [PATCH] scsi: qla4xxx: ql4_mbx.c: Cleaning up missing null-terminate 
in conjunction with strncpy

Replacing strncpy with strlcpy to avoid strings that lacks null terminate.
And in some cases modified to copy one character less than the overall length, 
as the entire area is already zeroed.

Signed-off-by: Rickard Strandqvist 
---
 drivers/scsi/qla4xxx/ql4_mbx.c |   14 +++---
 1 file changed, 7 insertions(+), 7 deletions(-)

diff --git a/drivers/scsi/qla4xxx/ql4_mbx.c b/drivers/scsi/qla4xxx/ql4_mbx.c 
index 0a3312c..2b2756e 100644
--- a/drivers/scsi/qla4xxx/ql4_mbx.c
+++ b/drivers/scsi/qla4xxx/ql4_mbx.c
@@ -1620,8 +1620,8 @@ int qla4xxx_get_chap(struct scsi_qla_host *ha, char 
*username, char *password,
goto exit_get_chap;
}
 
-   strncpy(password, chap_table->secret, QL4_CHAP_MAX_SECRET_LEN);
-   strncpy(username, chap_table->name, QL4_CHAP_MAX_NAME_LEN);
+   strlcpy(password, chap_table->secret, QL4_CHAP_MAX_SECRET_LEN);
+   strlcpy(username, chap_table->name, QL4_CHAP_MAX_NAME_LEN);
chap_table->cookie = __constant_cpu_to_le16(CHAP_VALID_COOKIE);
 
 exit_get_chap:
@@ -1663,8 +1663,8 @@ int qla4xxx_set_chap(struct scsi_qla_host *ha, char 
*username, char *password,
else
chap_table->flags |= BIT_7; /* local */
chap_table->secret_len = strlen(password);
-   strncpy(chap_table->secret, password, MAX_CHAP_SECRET_LEN);
-   strncpy(chap_table->name, username, MAX_CHAP_NAME_LEN);
+   strncpy(chap_table->secret, password, MAX_CHAP_SECRET_LEN - 1);
+   strncpy(chap_table->name, username, MAX_CHAP_NAME_LEN - 1);
chap_table->cookie = __constant_cpu_to_le16(CHAP_VALID_COOKIE);
 
if (is_qla40XX(ha)) {
@@ -1742,8 +1742,8 @@ int qla4xxx_get_uni_chap_at_index(struct scsi_qla_host 
*ha, char *username,
goto exit_unlock_uni_chap;
}
 
-   strncpy(password, chap_table->secret, MAX_CHAP_SECRET_LEN);
-   strncpy(username, chap_table->name, MAX_CHAP_NAME_LEN);
+   strlcpy(password, chap_table->secret, MAX_CHAP_SECRET_LEN);
+   strlcpy(username, chap_table->name, MAX_CHAP_NAME_LEN);
 
rval = QLA_SUCCESS;
 
@@ -2295,7 +2295,7 @@ int qla4_8xxx_set_param(struct scsi_qla_host *ha, int 
param)
if (param == SET_DRVR_VERSION) {
mbox_cmd[1] = SET_DRVR_VERSION;
strncpy((char *)&mbox_cmd[2], QLA4XXX_DRIVER_VERSION,
-   MAX_DRVR_VER_LEN);
+   MAX_DRVR_VER_LEN - 1);
} else {
ql4_printk(KERN_ERR, ha, "%s: invalid parameter 0x%x\n",
   __func__, param);
--
1.7.10.4

<>

RE: [PATCH] scsi: qla4xxx: ql4_os.c: Cleaning up missing null-terminate in conjunction with strncpy

2014-07-29 Thread Nilesh Javali
Acked-By: Nilesh Javali 


-Original Message-
From: Rickard Strandqvist [mailto:rickard_strandqv...@spectrumdigital.se] 
Sent: Saturday, July 26, 2014 8:20 PM
To: Vikas Chaudhary; Dept-Eng iSCSI Driver
Cc: Rickard Strandqvist; James E.J. Bottomley; linux-scsi; linux-kernel
Subject: [PATCH] scsi: qla4xxx: ql4_os.c: Cleaning up missing null-terminate in 
conjunction with strncpy

Replacing strncpy with strlcpy to avoid strings that lacks null terminate.

Signed-off-by: Rickard Strandqvist 
---
 drivers/scsi/qla4xxx/ql4_os.c |   14 +++---
 1 file changed, 7 insertions(+), 7 deletions(-)

diff --git a/drivers/scsi/qla4xxx/ql4_os.c b/drivers/scsi/qla4xxx/ql4_os.c 
index 3202063..a07c53e 100644
--- a/drivers/scsi/qla4xxx/ql4_os.c
+++ b/drivers/scsi/qla4xxx/ql4_os.c
@@ -756,9 +756,9 @@ static int qla4xxx_get_chap_list(struct Scsi_Host *shost, 
uint16_t chap_tbl_idx,
continue;
 
chap_rec->chap_tbl_idx = i;
-   strncpy(chap_rec->username, chap_table->name,
+   strlcpy(chap_rec->username, chap_table->name,
ISCSI_CHAP_AUTH_NAME_MAX_LEN);
-   strncpy(chap_rec->password, chap_table->secret,
+   strlcpy(chap_rec->password, chap_table->secret,
QL4_CHAP_MAX_SECRET_LEN);
chap_rec->password_length = chap_table->secret_len;
 
@@ -6027,8 +6027,8 @@ static int qla4xxx_get_bidi_chap(struct scsi_qla_host 
*ha, char *username,
if (!(chap_table->flags & BIT_6)) /* Not BIDI */
continue;
 
-   strncpy(password, chap_table->secret, QL4_CHAP_MAX_SECRET_LEN);
-   strncpy(username, chap_table->name, QL4_CHAP_MAX_NAME_LEN);
+   strlcpy(password, chap_table->secret, QL4_CHAP_MAX_SECRET_LEN);
+   strlcpy(username, chap_table->name, QL4_CHAP_MAX_NAME_LEN);
ret = 0;
break;
}
@@ -6258,8 +6258,8 @@ static void qla4xxx_get_param_ddb(struct ddb_entry 
*ddb_entry,
 
tddb->tpgt = sess->tpgt;
tddb->port = conn->persistent_port;
-   strncpy(tddb->iscsi_name, sess->targetname, ISCSI_NAME_SIZE);
-   strncpy(tddb->ip_addr, conn->persistent_address, DDB_IPADDR_LEN);
+   strlcpy(tddb->iscsi_name, sess->targetname, ISCSI_NAME_SIZE);
+   strlcpy(tddb->ip_addr, conn->persistent_address, DDB_IPADDR_LEN);
 }
 
 static void qla4xxx_convert_param_ddb(struct dev_db_entry *fw_ddb_entry, @@ 
-7764,7 +7764,7 @@ static int qla4xxx_sysfs_ddb_logout(struct 
iscsi_bus_flash_session *fnode_sess,
goto exit_ddb_logout;
}
 
-   strncpy(flash_tddb->iscsi_name, fnode_sess->targetname,
+   strlcpy(flash_tddb->iscsi_name, fnode_sess->targetname,
ISCSI_NAME_SIZE);
 
if (!strncmp(fnode_sess->portal_type, PORTAL_TYPE_IPV6, 4))
--
1.7.10.4

<>