Commit a15af54f authored by Gavin Shan's avatar Gavin Shan Committed by David S. Miller

net/ncsi: Rework request index allocation

The NCSI request index (struct ncsi_request::id) is put into instance
ID (IID) field while sending NCSI command packet. It was designed the
available IDs are given in round-robin fashion. @ndp->request_id was
introduced to represent the next available ID, but it has been used
as number of successively allocated IDs. It breaks the round-robin
design. Besides, we shouldn't put 0 to NCSI command packet's IID
field, meaning ID#0 should be reserved according section 6.3.1.1
in NCSI spec (v1.1.0).

This fixes above two issues. With it applied, the available IDs will
be assigned in round-robin fashion and ID#0 won't be assigned.
Signed-off-by: default avatarGavin Shan <gwshan@linux.vnet.ibm.com>
Reviewed-by: default avatarJoel Stanley <joel@jms.id.au>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 55e02d08
...@@ -259,6 +259,7 @@ struct ncsi_dev_priv { ...@@ -259,6 +259,7 @@ struct ncsi_dev_priv {
struct list_head packages; /* List of packages */ struct list_head packages; /* List of packages */
struct ncsi_request requests[256]; /* Request table */ struct ncsi_request requests[256]; /* Request table */
unsigned int request_id; /* Last used request ID */ unsigned int request_id; /* Last used request ID */
#define NCSI_REQ_START_IDX 1
unsigned int pending_req_num; /* Number of pending requests */ unsigned int pending_req_num; /* Number of pending requests */
struct ncsi_package *active_package; /* Currently handled package */ struct ncsi_package *active_package; /* Currently handled package */
struct ncsi_channel *active_channel; /* Currently handled channel */ struct ncsi_channel *active_channel; /* Currently handled channel */
......
...@@ -427,30 +427,31 @@ struct ncsi_request *ncsi_alloc_request(struct ncsi_dev_priv *ndp, bool driven) ...@@ -427,30 +427,31 @@ struct ncsi_request *ncsi_alloc_request(struct ncsi_dev_priv *ndp, bool driven)
/* Check if there is one available request until the ceiling */ /* Check if there is one available request until the ceiling */
spin_lock_irqsave(&ndp->lock, flags); spin_lock_irqsave(&ndp->lock, flags);
for (i = ndp->request_id; !nr && i < limit; i++) { for (i = ndp->request_id; i < limit; i++) {
if (ndp->requests[i].used) if (ndp->requests[i].used)
continue; continue;
nr = &ndp->requests[i]; nr = &ndp->requests[i];
nr->used = true; nr->used = true;
nr->driven = driven; nr->driven = driven;
if (++ndp->request_id >= limit) ndp->request_id = i + 1;
ndp->request_id = 0; goto found;
} }
/* Fail back to check from the starting cursor */ /* Fail back to check from the starting cursor */
for (i = 0; !nr && i < ndp->request_id; i++) { for (i = NCSI_REQ_START_IDX; i < ndp->request_id; i++) {
if (ndp->requests[i].used) if (ndp->requests[i].used)
continue; continue;
nr = &ndp->requests[i]; nr = &ndp->requests[i];
nr->used = true; nr->used = true;
nr->driven = driven; nr->driven = driven;
if (++ndp->request_id >= limit) ndp->request_id = i + 1;
ndp->request_id = 0; goto found;
} }
spin_unlock_irqrestore(&ndp->lock, flags);
found:
spin_unlock_irqrestore(&ndp->lock, flags);
return nr; return nr;
} }
...@@ -1148,7 +1149,7 @@ struct ncsi_dev *ncsi_register_dev(struct net_device *dev, ...@@ -1148,7 +1149,7 @@ struct ncsi_dev *ncsi_register_dev(struct net_device *dev,
/* Initialize private NCSI device */ /* Initialize private NCSI device */
spin_lock_init(&ndp->lock); spin_lock_init(&ndp->lock);
INIT_LIST_HEAD(&ndp->packages); INIT_LIST_HEAD(&ndp->packages);
ndp->request_id = 0; ndp->request_id = NCSI_REQ_START_IDX;
for (i = 0; i < ARRAY_SIZE(ndp->requests); i++) { for (i = 0; i < ARRAY_SIZE(ndp->requests); i++) {
ndp->requests[i].id = i; ndp->requests[i].id = i;
ndp->requests[i].ndp = ndp; ndp->requests[i].ndp = ndp;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment