* [PATCH V2 00/15] smartpqi update
@ 2016-08-31 19:54 Don Brace
2016-08-31 19:54 ` [PATCH V2 01/15] smartpqi: change aio sg processing Don Brace
` (15 more replies)
0 siblings, 16 replies; 22+ messages in thread
From: Don Brace @ 2016-08-31 19:54 UTC (permalink / raw)
To: jejb, john.hall, Kevin.Barnett, Mahesh.Rajashekhara, hch,
scott.teel, Viswas.G, Justin.Lindley, scott.benesh, elliott
Cc: linux-scsi
These changes are based on Linus's tree
The changes are:
- simplify aio processing
- simplify tmf macro names
- remove workaround for spanning
- add message for offlined drives
- enhance reset logic
- add support for kdump
- correct issue with offlined controller
- change timeout for events
- reformat function to match svn version
- correct update time scheduling
- minor queuecommand cleanup
- remove timeout on cache flush operation
- update smartpqi/Kconfig
- Martin K. Peterson's review
- add Documentation/scsi/smartpqi.txt
- Martin K. Peterson's review
- bump driver version
Changes since V1:
- squashed smartpqi-add-smartpqi.txt and
smartpqi-update-maintainers
as per Johannes Thumshirn <jthumshirn@suse.de> review.
- enhanced patch description for
smartpqi-correct-controller-offline-issue
as per Johannes Thumshirn <jthumshirn@suse.de> review.
- redacted patch smartpqi-change-function-to-inline
as per Johannes Thumshirn <jthumshirn@suse.de> review.
- The compiler in-lines small functions automatically.
---
Don Brace (1):
smartpqi: add smartpqi.txt
Kevin Barnett (14):
smartpqi: change aio sg processing
smartpqi: change tmf macro names
smartpqi: simplify spanning
smartpqi: enhance drive offline informational message
smartpqi: enhance reset logic
smartpqi: add kdump support
smartpqi: correct controller offline issue
smartpqi: correct event acknowledgment timeout issue
smartpqi: minor function reformating
smartpqi: minor tweaks to update time support
smartpqi: scsi queuecommand cleanup
smartpqi: remove timeout for cache flush operations
smartpqi: update Kconfig
smartqi: bump driver version
Documentation/scsi/smartpqi.txt | 80 ++++++++
MAINTAINERS | 1
drivers/scsi/smartpqi/Kconfig | 8 +
drivers/scsi/smartpqi/smartpqi.h | 35 ++--
drivers/scsi/smartpqi/smartpqi_init.c | 314 ++++++++++++++++-----------------
drivers/scsi/smartpqi/smartpqi_sis.c | 10 +
drivers/scsi/smartpqi/smartpqi_sis.h | 2
7 files changed, 273 insertions(+), 177 deletions(-)
create mode 100644 Documentation/scsi/smartpqi.txt
--
Signature
^ permalink raw reply [flat|nested] 22+ messages in thread
* [PATCH V2 01/15] smartpqi: change aio sg processing
2016-08-31 19:54 [PATCH V2 00/15] smartpqi update Don Brace
@ 2016-08-31 19:54 ` Don Brace
2016-08-31 19:54 ` [PATCH V2 02/15] smartpqi: change tmf macro names Don Brace
` (14 subsequent siblings)
15 siblings, 0 replies; 22+ messages in thread
From: Don Brace @ 2016-08-31 19:54 UTC (permalink / raw)
To: jejb, john.hall, Kevin.Barnett, Mahesh.Rajashekhara, hch,
scott.teel, Viswas.G, Justin.Lindley, scott.benesh, elliott
Cc: linux-scsi
From: Kevin Barnett <kevin.barnett@microsemi.com>
Take advantage of controller improvements.
Reviewed-by: Scott Teel <scott.teel@microsemi.com>
Reviewed-by: Scott Benesh <scott.benesh@microsemi.com>
Reviewed-by: Johannes Thumshirn <jthumshirn@suse.de>
Reviewed-by: Tomas Henzl <thenzl@redhat.com>
Signed-off-by: Kevin Barnett <kevin.barnett@microsemi.com>
Signed-off-by: Don Brace <don.brace@microsemi.com>
---
drivers/scsi/smartpqi/smartpqi_init.c | 68 +++++++++++++++++++--------------
1 file changed, 39 insertions(+), 29 deletions(-)
diff --git a/drivers/scsi/smartpqi/smartpqi_init.c b/drivers/scsi/smartpqi/smartpqi_init.c
index 906f1aa..418f636 100644
--- a/drivers/scsi/smartpqi/smartpqi_init.c
+++ b/drivers/scsi/smartpqi/smartpqi_init.c
@@ -4263,48 +4263,58 @@ static int pqi_build_aio_sg_list(struct pqi_ctrl_info *ctrl_info,
int i;
u16 iu_length;
int sg_count;
- unsigned int num_sg_in_iu = 0;
+ bool chained;
+ unsigned int num_sg_in_iu;
+ unsigned int max_sg_per_iu;
struct scatterlist *sg;
struct pqi_sg_descriptor *sg_descriptor;
sg_count = scsi_dma_map(scmd);
if (sg_count < 0)
return sg_count;
+
+ iu_length = offsetof(struct pqi_aio_path_request, sg_descriptors) -
+ PQI_REQUEST_HEADER_LENGTH;
+ num_sg_in_iu = 0;
+
if (sg_count == 0)
goto out;
- if (sg_count <= ctrl_info->max_sg_per_iu) {
- sg_descriptor = &request->sg_descriptors[0];
- scsi_for_each_sg(scmd, sg, sg_count, i) {
- pqi_set_sg_descriptor(sg_descriptor, sg);
- sg_descriptor++;
- }
- put_unaligned_le32(CISS_SG_LAST,
- &request->sg_descriptors[sg_count - 1].flags);
- num_sg_in_iu = sg_count;
- } else {
- sg_descriptor = &request->sg_descriptors[0];
- put_unaligned_le64((u64)io_request->sg_chain_buffer_dma_handle,
- &sg_descriptor->address);
- put_unaligned_le32(sg_count * sizeof(*sg_descriptor),
- &sg_descriptor->length);
- put_unaligned_le32(CISS_SG_CHAIN, &sg_descriptor->flags);
-
- sg_descriptor = io_request->sg_chain_buffer;
- scsi_for_each_sg(scmd, sg, sg_count, i) {
- pqi_set_sg_descriptor(sg_descriptor, sg);
- sg_descriptor++;
+ sg = scsi_sglist(scmd);
+ sg_descriptor = request->sg_descriptors;
+ max_sg_per_iu = ctrl_info->max_sg_per_iu - 1;
+ chained = false;
+ i = 0;
+
+ while (1) {
+ pqi_set_sg_descriptor(sg_descriptor, sg);
+ if (!chained)
+ num_sg_in_iu++;
+ i++;
+ if (i == sg_count)
+ break;
+ sg_descriptor++;
+ if (i == max_sg_per_iu) {
+ put_unaligned_le64(
+ (u64)io_request->sg_chain_buffer_dma_handle,
+ &sg_descriptor->address);
+ put_unaligned_le32((sg_count - num_sg_in_iu)
+ * sizeof(*sg_descriptor),
+ &sg_descriptor->length);
+ put_unaligned_le32(CISS_SG_CHAIN,
+ &sg_descriptor->flags);
+ chained = true;
+ num_sg_in_iu++;
+ sg_descriptor = io_request->sg_chain_buffer;
}
- put_unaligned_le32(CISS_SG_LAST,
- &io_request->sg_chain_buffer[sg_count - 1].flags);
- num_sg_in_iu = 1;
- request->partial = 1;
+ sg = sg_next(sg);
}
-out:
- iu_length = offsetof(struct pqi_aio_path_request, sg_descriptors) -
- PQI_REQUEST_HEADER_LENGTH;
+ put_unaligned_le32(CISS_SG_LAST, &sg_descriptor->flags);
+ request->partial = chained;
iu_length += num_sg_in_iu * sizeof(*sg_descriptor);
+
+out:
put_unaligned_le16(iu_length, &request->header.iu_length);
request->num_sg_descriptors = num_sg_in_iu;
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH V2 02/15] smartpqi: change tmf macro names
2016-08-31 19:54 [PATCH V2 00/15] smartpqi update Don Brace
2016-08-31 19:54 ` [PATCH V2 01/15] smartpqi: change aio sg processing Don Brace
@ 2016-08-31 19:54 ` Don Brace
2016-08-31 19:54 ` [PATCH V2 03/15] smartpqi: simplify spanning Don Brace
` (13 subsequent siblings)
15 siblings, 0 replies; 22+ messages in thread
From: Don Brace @ 2016-08-31 19:54 UTC (permalink / raw)
To: jejb, john.hall, Kevin.Barnett, Mahesh.Rajashekhara, hch,
scott.teel, Viswas.G, Justin.Lindley, scott.benesh, elliott
Cc: linux-scsi
From: Kevin Barnett <kevin.barnett@microsemi.com>
small change to make code look cleaner
Reviewed-by: Scott Teel <scott.teel@microsemi.com>
Reviewed-by: Scott Benesh <scott.benesh@microsemi.com>
Reviewed-by: Johannes Thumshirn <jthumshirn@suse.de>
Reviewed-by: Tomas Henzl <thenzl@redhat.com>
Signed-off-by: Kevin Barnett <kevin.barnett@microsemi.com>
Signed-off-by: Don Brace <don.brace@microsemi.com>
---
drivers/scsi/smartpqi/smartpqi.h | 6 ++----
drivers/scsi/smartpqi/smartpqi_init.c | 4 ++--
2 files changed, 4 insertions(+), 6 deletions(-)
diff --git a/drivers/scsi/smartpqi/smartpqi.h b/drivers/scsi/smartpqi/smartpqi.h
index ea49005..dbcdb03 100644
--- a/drivers/scsi/smartpqi/smartpqi.h
+++ b/drivers/scsi/smartpqi/smartpqi.h
@@ -545,10 +545,8 @@ typedef u32 pqi_index_t;
#define SOP_TASK_ATTRIBUTE_ORDERED 2
#define SOP_TASK_ATTRIBUTE_ACA 4
-#define SOP_TASK_MANAGEMENT_FUNCTION_COMPLETE 0x0
-#define SOP_TASK_MANAGEMENT_FUNCTION_REJECTED 0x4
-#define SOP_TASK_MANAGEMENT_FUNCTION_FAILED 0x5
-#define SOP_TASK_MANAGEMENT_FUNCTION_SUCCEEDED 0x8
+#define SOP_TMF_COMPLETE 0x0
+#define SOP_TMF_FUNCTION_SUCCEEDED 0x8
/* additional CDB bytes usage field codes */
#define SOP_ADDITIONAL_CDB_BYTES_0 0 /* 16-byte CDB */
diff --git a/drivers/scsi/smartpqi/smartpqi_init.c b/drivers/scsi/smartpqi/smartpqi_init.c
index 418f636..6eab38e 100644
--- a/drivers/scsi/smartpqi/smartpqi_init.c
+++ b/drivers/scsi/smartpqi/smartpqi_init.c
@@ -2469,8 +2469,8 @@ static int pqi_interpret_task_management_response(
int rc;
switch (response->response_code) {
- case SOP_TASK_MANAGEMENT_FUNCTION_COMPLETE:
- case SOP_TASK_MANAGEMENT_FUNCTION_SUCCEEDED:
+ case SOP_TMF_COMPLETE:
+ case SOP_TMF_FUNCTION_SUCCEEDED:
rc = 0;
break;
default:
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH V2 03/15] smartpqi: simplify spanning
2016-08-31 19:54 [PATCH V2 00/15] smartpqi update Don Brace
2016-08-31 19:54 ` [PATCH V2 01/15] smartpqi: change aio sg processing Don Brace
2016-08-31 19:54 ` [PATCH V2 02/15] smartpqi: change tmf macro names Don Brace
@ 2016-08-31 19:54 ` Don Brace
2016-08-31 19:54 ` [PATCH V2 04/15] smartpqi: enhance drive offline informational message Don Brace
` (12 subsequent siblings)
15 siblings, 0 replies; 22+ messages in thread
From: Don Brace @ 2016-08-31 19:54 UTC (permalink / raw)
To: jejb, john.hall, Kevin.Barnett, Mahesh.Rajashekhara, hch,
scott.teel, Viswas.G, Justin.Lindley, scott.benesh, elliott
Cc: linux-scsi
From: Kevin Barnett <kevin.barnett@microsemi.com>
Removed the workaround for the transition to spanning.
Reviewed-by: Scott Teel <scott.teel@microsemi.com>
Reviewed-by: Scott Benesh <scott.benesh@microsemi.com>
Reviewed-by: Johannes Thumshirn <jthumshirn@suse.de>
Reviewed-by: Tomas Henzl <thenzl@redhat.com>
Signed-off-by: Kevin Barnett <kevin.barnett@microsemi.com>
Signed-off-by: Don Brace <don.brace@microsemi.com>
---
drivers/scsi/smartpqi/smartpqi_init.c | 38 +++++++++++++++++----------------
1 file changed, 20 insertions(+), 18 deletions(-)
diff --git a/drivers/scsi/smartpqi/smartpqi_init.c b/drivers/scsi/smartpqi/smartpqi_init.c
index 6eab38e..9922e31 100644
--- a/drivers/scsi/smartpqi/smartpqi_init.c
+++ b/drivers/scsi/smartpqi/smartpqi_init.c
@@ -3663,6 +3663,18 @@ static int pqi_validate_device_capability(struct pqi_ctrl_info *ctrl_info)
return -EINVAL;
}
+ if (!ctrl_info->inbound_spanning_supported) {
+ dev_err(&ctrl_info->pci_dev->dev,
+ "the controller does not support inbound spanning\n");
+ return -EINVAL;
+ }
+
+ if (ctrl_info->outbound_spanning_supported) {
+ dev_err(&ctrl_info->pci_dev->dev,
+ "the controller supports outbound spanning but this driver does not\n");
+ return -EINVAL;
+ }
+
return 0;
}
@@ -4138,24 +4150,14 @@ static void pqi_calculate_queue_resources(struct pqi_ctrl_info *ctrl_info)
ctrl_info->num_queue_groups = num_queue_groups;
- if (ctrl_info->max_inbound_iu_length_per_firmware == 256 &&
- ctrl_info->outbound_spanning_supported) {
- /*
- * TEMPHACK
- * This is older f/w that doesn't actually support spanning.
- */
- ctrl_info->max_inbound_iu_length =
- PQI_OPERATIONAL_IQ_ELEMENT_LENGTH;
- } else {
- /*
- * Make sure that the max. inbound IU length is an even multiple
- * of our inbound element length.
- */
- ctrl_info->max_inbound_iu_length =
- (ctrl_info->max_inbound_iu_length_per_firmware /
- PQI_OPERATIONAL_IQ_ELEMENT_LENGTH) *
- PQI_OPERATIONAL_IQ_ELEMENT_LENGTH;
- }
+ /*
+ * Make sure that the max. inbound IU length is an even multiple
+ * of our inbound element length.
+ */
+ ctrl_info->max_inbound_iu_length =
+ (ctrl_info->max_inbound_iu_length_per_firmware /
+ PQI_OPERATIONAL_IQ_ELEMENT_LENGTH) *
+ PQI_OPERATIONAL_IQ_ELEMENT_LENGTH;
num_elements_per_iq =
(ctrl_info->max_inbound_iu_length /
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH V2 04/15] smartpqi: enhance drive offline informational message
2016-08-31 19:54 [PATCH V2 00/15] smartpqi update Don Brace
` (2 preceding siblings ...)
2016-08-31 19:54 ` [PATCH V2 03/15] smartpqi: simplify spanning Don Brace
@ 2016-08-31 19:54 ` Don Brace
2016-08-31 19:54 ` [PATCH V2 05/15] smartpqi: enhance reset logic Don Brace
` (11 subsequent siblings)
15 siblings, 0 replies; 22+ messages in thread
From: Don Brace @ 2016-08-31 19:54 UTC (permalink / raw)
To: jejb, john.hall, Kevin.Barnett, Mahesh.Rajashekhara, hch,
scott.teel, Viswas.G, Justin.Lindley, scott.benesh, elliott
Cc: linux-scsi
From: Kevin Barnett <kevin.barnett@microsemi.com>
Made a couple of error messages more verbose.
Reviewed-by: Scott Teel <scott.teel@microsemi.com>
Reviewed-by: Scott Benesh <scott.benesh@microsemi.com>
Reviewed-by: Johannes Thumshirn <jthumshirn@suse.de>
Reviewed-by: Tomas Henzl <thenzl@redhat.com>
Signed-off-by: Kevin Barnett <kevin.barnett@microsemi.com>
Signed-off-by: Don Brace <don.brace@microsemi.com>
---
drivers/scsi/smartpqi/smartpqi_init.c | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/drivers/scsi/smartpqi/smartpqi_init.c b/drivers/scsi/smartpqi/smartpqi_init.c
index 9922e31..198a7c2 100644
--- a/drivers/scsi/smartpqi/smartpqi_init.c
+++ b/drivers/scsi/smartpqi/smartpqi_init.c
@@ -2298,11 +2298,16 @@ static inline void pqi_aio_path_disabled(struct pqi_io_request *io_request)
static inline void pqi_take_device_offline(struct scsi_device *sdev)
{
struct pqi_ctrl_info *ctrl_info;
+ struct pqi_scsi_dev *device;
if (scsi_device_online(sdev)) {
scsi_device_set_state(sdev, SDEV_OFFLINE);
ctrl_info = shost_to_hba(sdev->host);
schedule_delayed_work(&ctrl_info->rescan_work, 0);
+ device = sdev->hostdata;
+ dev_err(&ctrl_info->pci_dev->dev, "offlined scsi %d:%d:%d:%d\n",
+ ctrl_info->scsi_host->host_no, device->bus,
+ device->target, device->lun);
}
}
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH V2 05/15] smartpqi: enhance reset logic
2016-08-31 19:54 [PATCH V2 00/15] smartpqi update Don Brace
` (3 preceding siblings ...)
2016-08-31 19:54 ` [PATCH V2 04/15] smartpqi: enhance drive offline informational message Don Brace
@ 2016-08-31 19:54 ` Don Brace
2016-08-31 19:54 ` [PATCH V2 06/15] smartpqi: add kdump support Don Brace
` (10 subsequent siblings)
15 siblings, 0 replies; 22+ messages in thread
From: Don Brace @ 2016-08-31 19:54 UTC (permalink / raw)
To: jejb, john.hall, Kevin.Barnett, Mahesh.Rajashekhara, hch,
scott.teel, Viswas.G, Justin.Lindley, scott.benesh, elliott
Cc: linux-scsi
From: Kevin Barnett <kevin.barnett@microsemi.com>
Eliminated timeout from LUN reset logic.
Reviewed-by: Scott Teel <scott.teel@microsemi.com>
Reviewed-by: Scott Benesh <scott.benesh@microsemi.com>
Reviewed-by: Johannes Thumshirn <jthumshirn@suse.de>
Reviewed-by: Tomas Henzl <thenzl@redhat.com>
Signed-off-by: Kevin Barnett <kevin.barnett@microsemi.com>
Signed-off-by: Don Brace <don.brace@microsemi.com>
---
drivers/scsi/smartpqi/smartpqi.h | 2 -
drivers/scsi/smartpqi/smartpqi_init.c | 101 +++++++++++----------------------
2 files changed, 35 insertions(+), 68 deletions(-)
diff --git a/drivers/scsi/smartpqi/smartpqi.h b/drivers/scsi/smartpqi/smartpqi.h
index dbcdb03..053be6b 100644
--- a/drivers/scsi/smartpqi/smartpqi.h
+++ b/drivers/scsi/smartpqi/smartpqi.h
@@ -370,7 +370,6 @@ struct pqi_task_management_request {
};
#define SOP_TASK_MANAGEMENT_LUN_RESET 0x8
-#define PQI_ABORT_TIMEOUT_MSECS (20 * 1000)
struct pqi_task_management_response {
struct pqi_iu_header header;
@@ -762,7 +761,6 @@ struct pqi_scsi_dev {
struct pqi_sas_port *sas_port;
struct scsi_device *sdev;
- bool reset_in_progress;
struct list_head scsi_device_list_entry;
struct list_head new_device_list_entry;
diff --git a/drivers/scsi/smartpqi/smartpqi_init.c b/drivers/scsi/smartpqi/smartpqi_init.c
index 198a7c2..dbc8b40 100644
--- a/drivers/scsi/smartpqi/smartpqi_init.c
+++ b/drivers/scsi/smartpqi/smartpqi_init.c
@@ -4537,13 +4537,6 @@ static int pqi_scsi_queue_command(struct Scsi_Host *shost,
bool raid_bypassed;
device = scmd->device->hostdata;
-
- if (device->reset_in_progress) {
- set_host_byte(scmd, DID_RESET);
- pqi_scsi_done(scmd);
- return 0;
- }
-
ctrl_info = shost_to_hba(shost);
if (pqi_ctrl_offline(ctrl_info)) {
@@ -4585,61 +4578,47 @@ static int pqi_scsi_queue_command(struct Scsi_Host *shost,
return rc;
}
-static inline void pqi_complete_queued_requests_queue_group(
- struct pqi_queue_group *queue_group,
- struct pqi_scsi_dev *device_in_reset)
+static void pqi_lun_reset_complete(struct pqi_io_request *io_request,
+ void *context)
{
- unsigned int path;
- unsigned long flags;
- struct pqi_io_request *io_request;
- struct pqi_io_request *next;
- struct scsi_cmnd *scmd;
- struct pqi_scsi_dev *device;
+ struct completion *waiting = context;
- for (path = 0; path < 2; path++) {
- spin_lock_irqsave(&queue_group->submit_lock[path], flags);
+ complete(waiting);
+}
- list_for_each_entry_safe(io_request, next,
- &queue_group->request_list[path],
- request_list_entry) {
- scmd = io_request->scmd;
- if (!scmd)
- continue;
- device = scmd->device->hostdata;
- if (device == device_in_reset) {
- set_host_byte(scmd, DID_RESET);
- pqi_scsi_done(scmd);
- list_del(&io_request->
- request_list_entry);
- }
+#define PQI_LUN_RESET_TIMEOUT_SECS 10
+
+static int pqi_wait_for_lun_reset_completion(struct pqi_ctrl_info *ctrl_info,
+ struct pqi_scsi_dev *device, struct completion *wait)
+{
+ int rc;
+ unsigned int wait_secs = 0;
+
+ while (1) {
+ if (wait_for_completion_io_timeout(wait,
+ PQI_LUN_RESET_TIMEOUT_SECS * HZ)) {
+ rc = 0;
+ break;
}
- spin_unlock_irqrestore(&queue_group->submit_lock[path], flags);
- }
-}
+ pqi_check_ctrl_health(ctrl_info);
+ if (pqi_ctrl_offline(ctrl_info)) {
+ rc = -ETIMEDOUT;
+ break;
+ }
-static void pqi_complete_queued_requests(struct pqi_ctrl_info *ctrl_info,
- struct pqi_scsi_dev *device_in_reset)
-{
- unsigned int i;
- struct pqi_queue_group *queue_group;
+ wait_secs += PQI_LUN_RESET_TIMEOUT_SECS;
- for (i = 0; i < ctrl_info->num_queue_groups; i++) {
- queue_group = &ctrl_info->queue_groups[i];
- pqi_complete_queued_requests_queue_group(queue_group,
- device_in_reset);
+ dev_err(&ctrl_info->pci_dev->dev,
+ "resetting scsi %d:%d:%d:%d - waiting %u seconds\n",
+ ctrl_info->scsi_host->host_no, device->bus,
+ device->target, device->lun, wait_secs);
}
-}
-static void pqi_reset_lun_complete(struct pqi_io_request *io_request,
- void *context)
-{
- struct completion *waiting = context;
-
- complete(waiting);
+ return rc;
}
-static int pqi_reset_lun(struct pqi_ctrl_info *ctrl_info,
+static int pqi_lun_reset(struct pqi_ctrl_info *ctrl_info,
struct pqi_scsi_dev *device)
{
int rc;
@@ -4650,7 +4629,7 @@ static int pqi_reset_lun(struct pqi_ctrl_info *ctrl_info,
down(&ctrl_info->lun_reset_sem);
io_request = pqi_alloc_io_request(ctrl_info);
- io_request->io_complete_callback = pqi_reset_lun_complete;
+ io_request->io_complete_callback = pqi_lun_reset_complete;
io_request->context = &wait;
request = io_request->iu;
@@ -4668,12 +4647,9 @@ static int pqi_reset_lun(struct pqi_ctrl_info *ctrl_info,
&ctrl_info->queue_groups[PQI_DEFAULT_QUEUE_GROUP], RAID_PATH,
io_request);
- if (!wait_for_completion_io_timeout(&wait,
- msecs_to_jiffies(PQI_ABORT_TIMEOUT_MSECS))) {
- rc = -ETIMEDOUT;
- } else {
+ rc = pqi_wait_for_lun_reset_completion(ctrl_info, device, &wait);
+ if (rc == 0)
rc = io_request->status;
- }
pqi_free_io_request(io_request);
up(&ctrl_info->lun_reset_sem);
@@ -4692,15 +4668,9 @@ static int pqi_device_reset(struct pqi_ctrl_info *ctrl_info,
if (pqi_ctrl_offline(ctrl_info))
return FAILED;
- device->reset_in_progress = true;
- pqi_complete_queued_requests(ctrl_info, device);
- rc = pqi_reset_lun(ctrl_info, device);
- device->reset_in_progress = false;
-
- if (rc)
- return FAILED;
+ rc = pqi_lun_reset(ctrl_info, device);
- return SUCCESS;
+ return rc == 0 ? SUCCESS : FAILED;
}
static int pqi_eh_device_reset_handler(struct scsi_cmnd *scmd)
@@ -4710,7 +4680,6 @@ static int pqi_eh_device_reset_handler(struct scsi_cmnd *scmd)
struct pqi_scsi_dev *device;
ctrl_info = shost_to_hba(scmd->device->host);
-
device = scmd->device->hostdata;
dev_err(&ctrl_info->pci_dev->dev,
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH V2 06/15] smartpqi: add kdump support
2016-08-31 19:54 [PATCH V2 00/15] smartpqi update Don Brace
` (4 preceding siblings ...)
2016-08-31 19:54 ` [PATCH V2 05/15] smartpqi: enhance reset logic Don Brace
@ 2016-08-31 19:54 ` Don Brace
2016-08-31 19:54 ` [PATCH V2 07/15] smartpqi: correct controller offline issue Don Brace
` (9 subsequent siblings)
15 siblings, 0 replies; 22+ messages in thread
From: Don Brace @ 2016-08-31 19:54 UTC (permalink / raw)
To: jejb, john.hall, Kevin.Barnett, Mahesh.Rajashekhara, hch,
scott.teel, Viswas.G, Justin.Lindley, scott.benesh, elliott
Cc: linux-scsi
From: Kevin Barnett <kevin.barnett@microsemi.com>
Reviewed-by: Scott Teel <scott.teel@microsemi.com>
Reviewed-by: Scott Benesh <scott.benesh@microsemi.com>
Reviewed-by: Johannes Thumshirn <jthumshirn@suse.de>
Reviewed-by: Tomas Henzl <thenzl@redhat.com>
Signed-off-by: Kevin Barnett <kevin.barnett@microsemi.com>
Signed-off-by: Don Brace <don.brace@microsemi.com>
---
drivers/scsi/smartpqi/smartpqi.h | 13 +++++++++---
drivers/scsi/smartpqi/smartpqi_init.c | 35 +++++++++++++++++++++++++++++++++
drivers/scsi/smartpqi/smartpqi_sis.c | 10 +++++++++
drivers/scsi/smartpqi/smartpqi_sis.h | 2 ++
4 files changed, 57 insertions(+), 3 deletions(-)
diff --git a/drivers/scsi/smartpqi/smartpqi.h b/drivers/scsi/smartpqi/smartpqi.h
index 053be6b..5f965ad 100644
--- a/drivers/scsi/smartpqi/smartpqi.h
+++ b/drivers/scsi/smartpqi/smartpqi.h
@@ -79,11 +79,13 @@ struct pqi_ctrl_registers {
__le32 sis_ctrl_to_host_doorbell; /* 9Ch */
u8 reserved3[0xa0 - (0x9c + sizeof(__le32))];
__le32 sis_ctrl_to_host_doorbell_clear; /* A0h */
- u8 reserved4[0xbc - (0xa0 + sizeof(__le32))];
+ u8 reserved4[0xb0 - (0xa0 + sizeof(__le32))];
+ __le32 sis_driver_scratch; /* B0h */
+ u8 reserved5[0xbc - (0xb0 + sizeof(__le32))];
__le32 sis_firmware_status; /* BCh */
- u8 reserved5[0x1000 - (0xbc + sizeof(__le32))];
+ u8 reserved6[0x1000 - (0xbc + sizeof(__le32))];
__le32 sis_mailbox[8]; /* 1000h */
- u8 reserved6[0x4000 - (0x1000 + (sizeof(__le32) * 8))];
+ u8 reserved7[0x4000 - (0x1000 + (sizeof(__le32) * 8))];
/*
* The PQI spec states that the PQI registers should be at
* offset 0 from the PCIe BAR 0. However, we can't map
@@ -963,6 +965,11 @@ struct pqi_ctrl_info {
struct semaphore lun_reset_sem;
};
+enum pqi_ctrl_mode {
+ UNKNOWN,
+ PQI_MODE
+};
+
/*
* assume worst case: SATA queue depth of 31 minus 4 internal firmware commands
*/
diff --git a/drivers/scsi/smartpqi/smartpqi_init.c b/drivers/scsi/smartpqi/smartpqi_init.c
index dbc8b40..43bfeac 100644
--- a/drivers/scsi/smartpqi/smartpqi_init.c
+++ b/drivers/scsi/smartpqi/smartpqi_init.c
@@ -153,6 +153,18 @@ static inline bool pqi_is_hba_lunid(u8 *scsi3addr)
return pqi_scsi3addr_equal(scsi3addr, RAID_CTLR_LUNID);
}
+static inline enum pqi_ctrl_mode pqi_get_ctrl_mode(
+ struct pqi_ctrl_info *ctrl_info)
+{
+ return sis_read_driver_scratch(ctrl_info);
+}
+
+static inline void pqi_save_ctrl_mode(struct pqi_ctrl_info *ctrl_info,
+ enum pqi_ctrl_mode mode)
+{
+ sis_write_driver_scratch(ctrl_info, mode);
+}
+
#define PQI_RESCAN_WORK_INTERVAL (10 * HZ)
static inline void pqi_schedule_rescan_worker(struct pqi_ctrl_info *ctrl_info)
@@ -5266,10 +5278,30 @@ out:
return rc;
}
+static int pqi_kdump_init(struct pqi_ctrl_info *ctrl_info)
+{
+ if (!sis_is_firmware_running(ctrl_info))
+ return -ENXIO;
+
+ if (pqi_get_ctrl_mode(ctrl_info) == PQI_MODE) {
+ sis_disable_msix(ctrl_info);
+ if (pqi_reset(ctrl_info) == 0)
+ sis_reenable_sis_mode(ctrl_info);
+ }
+
+ return 0;
+}
+
static int pqi_ctrl_init(struct pqi_ctrl_info *ctrl_info)
{
int rc;
+ if (reset_devices) {
+ rc = pqi_kdump_init(ctrl_info);
+ if (rc)
+ return rc;
+ }
+
/*
* When the controller comes out of reset, it is always running
* in legacy SIS mode. This is so that it can be compatible
@@ -5343,6 +5375,7 @@ static int pqi_ctrl_init(struct pqi_ctrl_info *ctrl_info)
/* From here on, we are running in PQI mode. */
ctrl_info->pqi_mode_enabled = true;
+ pqi_save_ctrl_mode(ctrl_info, PQI_MODE);
rc = pqi_alloc_admin_queues(ctrl_info);
if (rc) {
@@ -5879,6 +5912,8 @@ static void __attribute__((unused)) verify_structures(void)
BUILD_BUG_ON(offsetof(struct pqi_ctrl_registers,
sis_ctrl_to_host_doorbell_clear) != 0xa0);
BUILD_BUG_ON(offsetof(struct pqi_ctrl_registers,
+ sis_driver_scratch) != 0xb0);
+ BUILD_BUG_ON(offsetof(struct pqi_ctrl_registers,
sis_firmware_status) != 0xbc);
BUILD_BUG_ON(offsetof(struct pqi_ctrl_registers,
sis_mailbox) != 0x1000);
diff --git a/drivers/scsi/smartpqi/smartpqi_sis.c b/drivers/scsi/smartpqi/smartpqi_sis.c
index 5d416a8..71408f9 100644
--- a/drivers/scsi/smartpqi/smartpqi_sis.c
+++ b/drivers/scsi/smartpqi/smartpqi_sis.c
@@ -376,6 +376,16 @@ int sis_reenable_sis_mode(struct pqi_ctrl_info *ctrl_info)
return rc;
}
+void sis_write_driver_scratch(struct pqi_ctrl_info *ctrl_info, u32 value)
+{
+ writel(value, &ctrl_info->registers->sis_driver_scratch);
+}
+
+u32 sis_read_driver_scratch(struct pqi_ctrl_info *ctrl_info)
+{
+ return readl(&ctrl_info->registers->sis_driver_scratch);
+}
+
static void __attribute__((unused)) verify_structures(void)
{
BUILD_BUG_ON(offsetof(struct sis_base_struct,
diff --git a/drivers/scsi/smartpqi/smartpqi_sis.h b/drivers/scsi/smartpqi/smartpqi_sis.h
index d2ff8d5..bd6e7b0 100644
--- a/drivers/scsi/smartpqi/smartpqi_sis.h
+++ b/drivers/scsi/smartpqi/smartpqi_sis.h
@@ -28,5 +28,7 @@ void sis_enable_msix(struct pqi_ctrl_info *ctrl_info);
void sis_disable_msix(struct pqi_ctrl_info *ctrl_info);
void sis_soft_reset(struct pqi_ctrl_info *ctrl_info);
int sis_reenable_sis_mode(struct pqi_ctrl_info *ctrl_info);
+void sis_write_driver_scratch(struct pqi_ctrl_info *ctrl_info, u32 value);
+u32 sis_read_driver_scratch(struct pqi_ctrl_info *ctrl_info);
#endif /* _SMARTPQI_SIS_H */
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH V2 07/15] smartpqi: correct controller offline issue
2016-08-31 19:54 [PATCH V2 00/15] smartpqi update Don Brace
` (5 preceding siblings ...)
2016-08-31 19:54 ` [PATCH V2 06/15] smartpqi: add kdump support Don Brace
@ 2016-08-31 19:54 ` Don Brace
2016-08-31 19:54 ` [PATCH V2 08/15] smartpqi: correct event acknowledgment timeout issue Don Brace
` (8 subsequent siblings)
15 siblings, 0 replies; 22+ messages in thread
From: Don Brace @ 2016-08-31 19:54 UTC (permalink / raw)
To: jejb, john.hall, Kevin.Barnett, Mahesh.Rajashekhara, hch,
scott.teel, Viswas.G, Justin.Lindley, scott.benesh, elliott
Cc: linux-scsi
From: Kevin Barnett <kevin.barnett@microsemi.com>
Fixes: 6c223761e 'smartpqi: initial commit of Microsemi smartpqi driver'
Fixed a bug where the driver would not free all of the
controller resources if the controller ever went offline.
Reviewed-by: Scott Teel <scott.teel@microsemi.com>
Reviewed-by: Scott Benesh <scott.benesh@microsemi.com>
Reviewed-by: Johannes Thumshirn <jthumshirn@suse.de>
Reviewed-by: Tomas Henzl <thenzl@redhat.com>
Signed-off-by: Kevin Barnett <kevin.barnett@microsemi.com>
Signed-off-by: Don Brace <don.brace@microsemi.com>
---
drivers/scsi/smartpqi/smartpqi_init.c | 15 +++++----------
1 file changed, 5 insertions(+), 10 deletions(-)
diff --git a/drivers/scsi/smartpqi/smartpqi_init.c b/drivers/scsi/smartpqi/smartpqi_init.c
index 43bfeac..d759703 100644
--- a/drivers/scsi/smartpqi/smartpqi_init.c
+++ b/drivers/scsi/smartpqi/smartpqi_init.c
@@ -5609,19 +5609,14 @@ static void pqi_free_ctrl_resources(struct pqi_ctrl_info *ctrl_info)
static void pqi_remove_ctrl(struct pqi_ctrl_info *ctrl_info)
{
- int rc;
+ cancel_delayed_work_sync(&ctrl_info->rescan_work);
+ cancel_delayed_work_sync(&ctrl_info->update_time_work);
+ pqi_remove_all_scsi_devices(ctrl_info);
+ pqi_unregister_scsi(ctrl_info);
- if (ctrl_info->controller_online) {
- cancel_delayed_work_sync(&ctrl_info->rescan_work);
- cancel_delayed_work_sync(&ctrl_info->update_time_work);
- pqi_remove_all_scsi_devices(ctrl_info);
- pqi_unregister_scsi(ctrl_info);
- ctrl_info->controller_online = false;
- }
if (ctrl_info->pqi_mode_enabled) {
sis_disable_msix(ctrl_info);
- rc = pqi_reset(ctrl_info);
- if (rc == 0)
+ if (pqi_reset(ctrl_info) == 0)
sis_reenable_sis_mode(ctrl_info);
}
pqi_free_ctrl_resources(ctrl_info);
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH V2 08/15] smartpqi: correct event acknowledgment timeout issue
2016-08-31 19:54 [PATCH V2 00/15] smartpqi update Don Brace
` (6 preceding siblings ...)
2016-08-31 19:54 ` [PATCH V2 07/15] smartpqi: correct controller offline issue Don Brace
@ 2016-08-31 19:54 ` Don Brace
2016-08-31 19:54 ` [PATCH V2 09/15] smartpqi: minor function reformating Don Brace
` (7 subsequent siblings)
15 siblings, 0 replies; 22+ messages in thread
From: Don Brace @ 2016-08-31 19:54 UTC (permalink / raw)
To: jejb, john.hall, Kevin.Barnett, Mahesh.Rajashekhara, hch,
scott.teel, Viswas.G, Justin.Lindley, scott.benesh, elliott
Cc: linux-scsi
From: Kevin Barnett <kevin.barnett@microsemi.com>
the driver no longer waits for the firmware to consume
the event ack IU.
Reviewed-by: Scott Teel <scott.teel@microsemi.com>
Reviewed-by: Scott Benesh <scott.benesh@microsemi.com>
Reviewed-by: Johannes Thumshirn <jthumshirn@suse.de>
Reviewed-by: Tomas Henzl <thenzl@redhat.com>
Signed-off-by: Kevin Barnett <kevin.barnett@microsemi.com>
Signed-off-by: Don Brace <don.brace@microsemi.com>
---
drivers/scsi/smartpqi/smartpqi.h | 14 +++++++-------
drivers/scsi/smartpqi/smartpqi_init.c | 20 --------------------
2 files changed, 7 insertions(+), 27 deletions(-)
diff --git a/drivers/scsi/smartpqi/smartpqi.h b/drivers/scsi/smartpqi/smartpqi.h
index 5f965ad..07b6444 100644
--- a/drivers/scsi/smartpqi/smartpqi.h
+++ b/drivers/scsi/smartpqi/smartpqi.h
@@ -634,13 +634,6 @@ struct pqi_encryption_info {
#define RAID_MAP_MAX_ENTRIES 1024
-#define PQI_RESERVED_IO_SLOTS_LUN_RESET 1
-#define PQI_RESERVED_IO_SLOTS_EVENT_ACK 1
-#define PQI_RESERVED_IO_SLOTS_SYNCHRONOUS_REQUESTS 3
-#define PQI_RESERVED_IO_SLOTS \
- (PQI_RESERVED_IO_SLOTS_LUN_RESET + PQI_RESERVED_IO_SLOTS_EVENT_ACK + \
- PQI_RESERVED_IO_SLOTS_SYNCHRONOUS_REQUESTS)
-
#define PQI_PHYSICAL_DEVICE_BUS 0
#define PQI_RAID_VOLUME_BUS 1
#define PQI_HBA_BUS 2
@@ -884,6 +877,13 @@ struct pqi_event {
__le32 additional_event_id;
};
+#define PQI_RESERVED_IO_SLOTS_LUN_RESET 1
+#define PQI_RESERVED_IO_SLOTS_EVENT_ACK PQI_NUM_SUPPORTED_EVENTS
+#define PQI_RESERVED_IO_SLOTS_SYNCHRONOUS_REQUESTS 3
+#define PQI_RESERVED_IO_SLOTS \
+ (PQI_RESERVED_IO_SLOTS_LUN_RESET + PQI_RESERVED_IO_SLOTS_EVENT_ACK + \
+ PQI_RESERVED_IO_SLOTS_SYNCHRONOUS_REQUESTS)
+
struct pqi_ctrl_info {
unsigned int ctrl_id;
struct pci_dev *pci_dev;
diff --git a/drivers/scsi/smartpqi/smartpqi_init.c b/drivers/scsi/smartpqi/smartpqi_init.c
index d759703..ea822b1 100644
--- a/drivers/scsi/smartpqi/smartpqi_init.c
+++ b/drivers/scsi/smartpqi/smartpqi_init.c
@@ -2642,26 +2642,6 @@ static void pqi_start_event_ack(struct pqi_ctrl_info *ctrl_info,
writel(iq_pi, queue_group->iq_pi[RAID_PATH]);
spin_unlock_irqrestore(&queue_group->submit_lock[RAID_PATH], flags);
-
- /*
- * We have to special-case this type of request because the firmware
- * does not generate an interrupt when this type of request completes.
- * Therefore, we have to poll until we see that the firmware has
- * consumed the request before we move on.
- */
-
- timeout = (PQI_EVENT_ACK_TIMEOUT * HZ) + jiffies;
-
- while (1) {
- if (*queue_group->iq_ci[RAID_PATH] == iq_pi)
- break;
- if (time_after(jiffies, timeout)) {
- dev_err(&ctrl_info->pci_dev->dev,
- "completing event acknowledge timed out\n");
- break;
- }
- usleep_range(1000, 2000);
- }
}
static void pqi_acknowledge_event(struct pqi_ctrl_info *ctrl_info,
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH V2 09/15] smartpqi: minor function reformating
2016-08-31 19:54 [PATCH V2 00/15] smartpqi update Don Brace
` (7 preceding siblings ...)
2016-08-31 19:54 ` [PATCH V2 08/15] smartpqi: correct event acknowledgment timeout issue Don Brace
@ 2016-08-31 19:54 ` Don Brace
2016-09-01 7:16 ` Johannes Thumshirn
2016-08-31 19:55 ` [PATCH V2 10/15] smartpqi: minor tweaks to update time support Don Brace
` (6 subsequent siblings)
15 siblings, 1 reply; 22+ messages in thread
From: Don Brace @ 2016-08-31 19:54 UTC (permalink / raw)
To: jejb, john.hall, Kevin.Barnett, Mahesh.Rajashekhara, hch,
scott.teel, Viswas.G, Justin.Lindley, scott.benesh, elliott
Cc: linux-scsi
From: Kevin Barnett <kevin.barnett@microsemi.com>
reformatted pqi_num_elements_free() to match the rest of the driver
Reviewed-by: Scott Teel <scott.teel@microsemi.com>
Reviewed-by: Scott Benesh <scott.benesh@microsemi.com>
Reviewed-by: Tomas Henzl <thenzl@redhat.com>
Signed-off-by: Kevin Barnett <kevin.barnett@microsemi.com>
Signed-off-by: Don Brace <don.brace@microsemi.com>
---
drivers/scsi/smartpqi/smartpqi_init.c | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/drivers/scsi/smartpqi/smartpqi_init.c b/drivers/scsi/smartpqi/smartpqi_init.c
index ea822b1..bfd2d75 100644
--- a/drivers/scsi/smartpqi/smartpqi_init.c
+++ b/drivers/scsi/smartpqi/smartpqi_init.c
@@ -2576,8 +2576,7 @@ static unsigned int pqi_process_io_intr(struct pqi_ctrl_info *ctrl_info,
}
static inline unsigned int pqi_num_elements_free(unsigned int pi,
- unsigned int ci,
- unsigned int elements_in_queue)
+ unsigned int ci, unsigned int elements_in_queue)
{
unsigned int num_elements_used;
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH V2 10/15] smartpqi: minor tweaks to update time support
2016-08-31 19:54 [PATCH V2 00/15] smartpqi update Don Brace
` (8 preceding siblings ...)
2016-08-31 19:54 ` [PATCH V2 09/15] smartpqi: minor function reformating Don Brace
@ 2016-08-31 19:55 ` Don Brace
2016-08-31 19:55 ` [PATCH V2 11/15] smartpqi: scsi queuecommand cleanup Don Brace
` (5 subsequent siblings)
15 siblings, 0 replies; 22+ messages in thread
From: Don Brace @ 2016-08-31 19:55 UTC (permalink / raw)
To: jejb, john.hall, Kevin.Barnett, Mahesh.Rajashekhara, hch,
scott.teel, Viswas.G, Justin.Lindley, scott.benesh, elliott
Cc: linux-scsi
From: Kevin Barnett <kevin.barnett@microsemi.com>
minor tweaks to update time support
Reviewed-by: Scott Teel <scott.teel@microsemi.com>
Reviewed-by: Scott Benesh <scott.benesh@microsemi.com>
Reviewed-by: Johannes Thumshirn <jthumshirn@suse.de>
Signed-off-by: Kevin Barnett <kevin.barnett@microsemi.com>
Signed-off-by: Don Brace <don.brace@microsemi.com>
---
drivers/scsi/smartpqi/smartpqi_init.c | 8 ++------
1 file changed, 2 insertions(+), 6 deletions(-)
diff --git a/drivers/scsi/smartpqi/smartpqi_init.c b/drivers/scsi/smartpqi/smartpqi_init.c
index bfd2d75..db248c1 100644
--- a/drivers/scsi/smartpqi/smartpqi_init.c
+++ b/drivers/scsi/smartpqi/smartpqi_init.c
@@ -588,10 +588,6 @@ static void pqi_update_time_worker(struct work_struct *work)
ctrl_info = container_of(to_delayed_work(work), struct pqi_ctrl_info,
update_time_work);
- if (!ctrl_info) {
- printk("%s: NULL controller pointer.\n", __func__);
- return;
- }
rc = pqi_write_current_time_to_host_wellness(ctrl_info);
if (rc)
dev_warn(&ctrl_info->pci_dev->dev,
@@ -602,9 +598,9 @@ static void pqi_update_time_worker(struct work_struct *work)
}
static inline void pqi_schedule_update_time_worker(
- struct pqi_ctrl_info *ctrl_info)
+ struct pqi_ctrl_info *ctrl_info)
{
- schedule_delayed_work(&ctrl_info->update_time_work, 120);
+ schedule_delayed_work(&ctrl_info->update_time_work, 0);
}
static int pqi_report_luns(struct pqi_ctrl_info *ctrl_info, u8 cmd,
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH V2 11/15] smartpqi: scsi queuecommand cleanup
2016-08-31 19:54 [PATCH V2 00/15] smartpqi update Don Brace
` (9 preceding siblings ...)
2016-08-31 19:55 ` [PATCH V2 10/15] smartpqi: minor tweaks to update time support Don Brace
@ 2016-08-31 19:55 ` Don Brace
2016-08-31 19:55 ` [PATCH V2 12/15] smartpqi: remove timeout for cache flush operations Don Brace
` (4 subsequent siblings)
15 siblings, 0 replies; 22+ messages in thread
From: Don Brace @ 2016-08-31 19:55 UTC (permalink / raw)
To: jejb, john.hall, Kevin.Barnett, Mahesh.Rajashekhara, hch,
scott.teel, Viswas.G, Justin.Lindley, scott.benesh, elliott
Cc: linux-scsi
From: Kevin Barnett <kevin.barnett@microsemi.com>
minor cleanup of scsi queue command function
Reviewed-by: Scott Teel <scott.teel@microsemi.com>
Reviewed-by: Scott Benesh <scott.benesh@microsemi.com>
Reviewed-by: Johannes Thumshirn <jthumshirn@suse.de>
Reviewed-by: Tomas Henzl <thenzl@redhat.com>
Signed-off-by: Kevin Barnett <kevin.barnett@microsemi.com>
Signed-off-by: Don Brace <don.brace@microsemi.com>
---
drivers/scsi/smartpqi/smartpqi_init.c | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)
diff --git a/drivers/scsi/smartpqi/smartpqi_init.c b/drivers/scsi/smartpqi/smartpqi_init.c
index db248c1..f0672ed 100644
--- a/drivers/scsi/smartpqi/smartpqi_init.c
+++ b/drivers/scsi/smartpqi/smartpqi_init.c
@@ -4514,7 +4514,7 @@ static int pqi_aio_submit_io(struct pqi_ctrl_info *ctrl_info,
}
static int pqi_scsi_queue_command(struct Scsi_Host *shost,
- struct scsi_cmnd *scmd)
+ struct scsi_cmnd *scmd)
{
int rc;
struct pqi_ctrl_info *ctrl_info;
@@ -4532,6 +4532,12 @@ static int pqi_scsi_queue_command(struct Scsi_Host *shost,
return 0;
}
+ /*
+ * This is necessary because the SML doesn't zero out this field during
+ * error recovery.
+ */
+ scmd->result = 0;
+
hwq = blk_mq_unique_tag_to_hwq(blk_mq_unique_tag(scmd->request));
if (hwq >= ctrl_info->num_queue_groups)
hwq = 0;
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH V2 12/15] smartpqi: remove timeout for cache flush operations
2016-08-31 19:54 [PATCH V2 00/15] smartpqi update Don Brace
` (10 preceding siblings ...)
2016-08-31 19:55 ` [PATCH V2 11/15] smartpqi: scsi queuecommand cleanup Don Brace
@ 2016-08-31 19:55 ` Don Brace
2016-08-31 19:55 ` [PATCH V2 13/15] smartpqi: update Kconfig Don Brace
` (3 subsequent siblings)
15 siblings, 0 replies; 22+ messages in thread
From: Don Brace @ 2016-08-31 19:55 UTC (permalink / raw)
To: jejb, john.hall, Kevin.Barnett, Mahesh.Rajashekhara, hch,
scott.teel, Viswas.G, Justin.Lindley, scott.benesh, elliott
Cc: linux-scsi
From: Kevin Barnett <kevin.barnett@microsemi.com>
Some cache flush operations can take longer than the
timeout value. Best to not impose a time limit to
handle all cases.
Reviewed-by: Scott Teel <scott.teel@microsemi.com>
Reviewed-by: Scott Benesh <scott.benesh@microsemi.com>
Reviewed-by: Johannes Thumshirn <jthumshirn@suse.de>
Reviewed-by: Tomas Henzl <thenzl@redhat.com>
Signed-off-by: Kevin Barnett <kevin.barnett@microsemi.com>
Signed-off-by: Don Brace <don.brace@microsemi.com>
---
drivers/scsi/smartpqi/smartpqi_init.c | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/drivers/scsi/smartpqi/smartpqi_init.c b/drivers/scsi/smartpqi/smartpqi_init.c
index f0672ed..c6dcb33 100644
--- a/drivers/scsi/smartpqi/smartpqi_init.c
+++ b/drivers/scsi/smartpqi/smartpqi_init.c
@@ -407,7 +407,6 @@ static int pqi_identify_physical_device(struct pqi_ctrl_info *ctrl_info,
}
#define SA_CACHE_FLUSH_BUFFER_LENGTH 4
-#define PQI_FLUSH_CACHE_TIMEOUT (30 * 1000)
static int pqi_flush_cache(struct pqi_ctrl_info *ctrl_info)
{
@@ -434,7 +433,7 @@ static int pqi_flush_cache(struct pqi_ctrl_info *ctrl_info)
goto out;
rc = pqi_submit_raid_request_synchronous(ctrl_info, &request.header,
- 0, NULL, PQI_FLUSH_CACHE_TIMEOUT);
+ 0, NULL, NO_TIMEOUT);
pqi_pci_unmap(ctrl_info->pci_dev, request.sg_descriptors, 1,
pci_direction);
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH V2 13/15] smartpqi: update Kconfig
2016-08-31 19:54 [PATCH V2 00/15] smartpqi update Don Brace
` (11 preceding siblings ...)
2016-08-31 19:55 ` [PATCH V2 12/15] smartpqi: remove timeout for cache flush operations Don Brace
@ 2016-08-31 19:55 ` Don Brace
2016-08-31 19:55 ` [PATCH V2 14/15] smartpqi: add smartpqi.txt Don Brace
` (2 subsequent siblings)
15 siblings, 0 replies; 22+ messages in thread
From: Don Brace @ 2016-08-31 19:55 UTC (permalink / raw)
To: jejb, john.hall, Kevin.Barnett, Mahesh.Rajashekhara, hch,
scott.teel, Viswas.G, Justin.Lindley, scott.benesh, elliott
Cc: linux-scsi
From: Kevin Barnett <kevin.barnett@microsemi.com>
The aacraid driver will not managage Microsemi
smartpqi controllers, but will still manage
older aacraid devices.
Updated help section.
Reviewed-by: Scott Teel <scott.teel@microsemi.com>
Reviewed-by: Scott Benesh <scott.benesh@microsemi.com>
Reviewed-by: Kevin Barnett <kevin.barnett@microsemi.com>
Reviewed-by: Johannes Thumshirn <jthumshirn@suse.de>
Reviewed-by: Tomas Henzl <thenzl@redhat.com>
Signed-off-by: Don Brace <don.brace@microsemi.com>
---
drivers/scsi/smartpqi/Kconfig | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)
diff --git a/drivers/scsi/smartpqi/Kconfig b/drivers/scsi/smartpqi/Kconfig
index 5d77a80..97e159c 100644
--- a/drivers/scsi/smartpqi/Kconfig
+++ b/drivers/scsi/smartpqi/Kconfig
@@ -37,7 +37,6 @@
config SCSI_SMARTPQI
tristate "Microsemi PQI Driver"
- default n
depends on PCI && SCSI && !S390
select SCSI_SAS_ATTRS
select RAID_ATTRS
@@ -47,4 +46,9 @@ config SCSI_SMARTPQI
<http://www.microsemi.com>
To compile this driver as a module, choose M here: the
- module will be called smartpqi
+ module will be called smartpqi.
+
+ Note: the aacraid driver will not manage a smartpqi
+ controller. You need to enable smartpqi for smartpqi
+ controllers. For more information, please see
+ Documentation/scsi/smartpqi.txt
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH V2 14/15] smartpqi: add smartpqi.txt
2016-08-31 19:54 [PATCH V2 00/15] smartpqi update Don Brace
` (12 preceding siblings ...)
2016-08-31 19:55 ` [PATCH V2 13/15] smartpqi: update Kconfig Don Brace
@ 2016-08-31 19:55 ` Don Brace
2016-09-01 13:21 ` Tomas Henzl
2016-08-31 19:55 ` [PATCH V2 15/15] smartqi: bump driver version Don Brace
2016-09-02 10:30 ` [PATCH V2 00/15] smartpqi update Martin K. Petersen
15 siblings, 1 reply; 22+ messages in thread
From: Don Brace @ 2016-08-31 19:55 UTC (permalink / raw)
To: jejb, john.hall, Kevin.Barnett, Mahesh.Rajashekhara, hch,
scott.teel, Viswas.G, Justin.Lindley, scott.benesh, elliott
Cc: linux-scsi
added Documentation/scsi/smartpqi.txt
Reviewed-by: Kevin Barnett <kevin.barnett@microsemi.com>
Reviewed-by: Scott Benesh <scott.benesh@microsemi.com>
Reviewed-by: Johannes Thumshirn <jthumshirn@suse.de>
Signed-off-by: Don Brace <don.brace@microsemi.com>
---
Documentation/scsi/smartpqi.txt | 80 +++++++++++++++++++++++++++++++++++++++
MAINTAINERS | 1
2 files changed, 81 insertions(+)
create mode 100644 Documentation/scsi/smartpqi.txt
diff --git a/Documentation/scsi/smartpqi.txt b/Documentation/scsi/smartpqi.txt
new file mode 100644
index 0000000..ab377d9
--- /dev/null
+++ b/Documentation/scsi/smartpqi.txt
@@ -0,0 +1,80 @@
+
+SMARTPQI - Microsemi Smart PQI Driver
+-----------------------------------------
+
+This file describes the smartpqi SCSI driver for Microsemi
+(http://www.microsemi.com) PQI controllers. The smartpqi driver
+is the next generation SCSI driver for Microsemi Corp. The smartpqi
+driver is the first SCSI driver to implement the PQI queuing model.
+
+The smartpqi driver will replace the aacraid driver for Adaptec Series 9
+controllers. Customers running an older kernel (Pre-4.9) using an Adaptec
+Series 9 controller will have to configure the smartpqi driver or their
+volumes will not be added to the OS.
+
+For Microsemi smartpqi controller support, enable the smartpqi driver
+when configuring the kernel.
+
+For more information on the PQI Queuing Interface, please see:
+http://www.t10.org/drafts.htm
+http://www.t10.org/members/w_pqi2.htm
+
+Supported devices:
+------------------
+<Controller names to be added as they become publically available.>
+
+smartpqi specific entries in /sys
+-----------------------------
+
+ smartpqi host attributes:
+ -------------------------
+ /sys/class/scsi_host/host*/rescan
+ /sys/class/scsi_host/host*/version
+
+ The host rescan attribute is a write only attribute. Writing to this
+ attribute will trigger the driver to scan for new, changed, or removed
+ devices and notify the SCSI mid-layer of any changes detected.
+
+ The version attribute is read-only and will return the driver version
+ and the controller firmware version.
+ For example:
+ driver: 0.9.13-370
+ firmware: 0.01-522
+
+ smartpqi sas device attributes
+ ------------------------------
+ HBA devices are added to the SAS transport layer. These attributes are
+ automatically added by the SAS transport layer.
+
+ /sys/class/sas_device/end_device-X:X/sas_address
+ /sys/class/sas_device/end_device-X:X/enclosure_identifier
+ /sys/class/sas_device/end_device-X:X/scsi_target_id
+
+smartpqi specific ioctls:
+-------------------------
+
+ For compatibility with applications written for the cciss protocol.
+
+ CCISS_DEREGDISK
+ CCISS_REGNEWDISK
+ CCISS_REGNEWD
+
+ The above three ioctls all do exactly the same thing, which is to cause the driver
+ to rescan for new devices. This does exactly the same thing as writing to the
+ smartpqi specific host "rescan" attribute.
+
+ CCISS_GETPCIINFO
+
+ Returns PCI domain, bus, device and function and "board ID" (PCI subsystem ID).
+
+ CCISS_GETDRIVVER
+
+ Returns driver version in three bytes encoded as:
+ (DRIVER_MAJOR << 28) | (DRIVER_MINOR << 24) | (DRIVER_RELEASE << 16) | DRIVER_REVISION;
+
+ CCISS_PASSTHRU
+
+ Allows "BMIC" and "CISS" commands to be passed through to the Smart Storage Array.
+ These are used extensively by the SSA Array Configuration Utility, SNMP storage
+ agents, etc.
+
diff --git a/MAINTAINERS b/MAINTAINERS
index a05b045..ce68350 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -5456,6 +5456,7 @@ F: drivers/scsi/smartpqi/Kconfig
F: drivers/scsi/smartpqi/Makefile
F: include/linux/cciss*.h
F: include/uapi/linux/cciss*.h
+F: Documentation/scsi/smartpqi.txt
HEWLETT-PACKARD SMART ARRAY RAID DRIVER (hpsa)
M: Don Brace <don.brace@microsemi.com>
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH V2 15/15] smartqi: bump driver version
2016-08-31 19:54 [PATCH V2 00/15] smartpqi update Don Brace
` (13 preceding siblings ...)
2016-08-31 19:55 ` [PATCH V2 14/15] smartpqi: add smartpqi.txt Don Brace
@ 2016-08-31 19:55 ` Don Brace
2016-09-01 7:17 ` Johannes Thumshirn
2016-09-02 10:30 ` [PATCH V2 00/15] smartpqi update Martin K. Petersen
15 siblings, 1 reply; 22+ messages in thread
From: Don Brace @ 2016-08-31 19:55 UTC (permalink / raw)
To: jejb, john.hall, Kevin.Barnett, Mahesh.Rajashekhara, hch,
scott.teel, Viswas.G, Justin.Lindley, scott.benesh, elliott
Cc: linux-scsi
From: Kevin Barnett <kevin.barnett@microsemi.com>
Reviewed-by: Scott Teel <scott.teel@microsemi.com>
Reviewed-by: Scott Benesh <scott.benesh@microsemi.com>
Reviewed-by: Tomas Henzl <thenzl@redhat.com>
Signed-off-by: Kevin Barnett <kevin.barnett@microsemi.com>
Signed-off-by: Don Brace <don.brace@microsemi.com>
---
drivers/scsi/smartpqi/smartpqi_init.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/drivers/scsi/smartpqi/smartpqi_init.c b/drivers/scsi/smartpqi/smartpqi_init.c
index c6dcb33..52cfa26 100644
--- a/drivers/scsi/smartpqi/smartpqi_init.c
+++ b/drivers/scsi/smartpqi/smartpqi_init.c
@@ -38,11 +38,11 @@
#define BUILD_TIMESTAMP
#endif
-#define DRIVER_VERSION "0.9.9-100"
+#define DRIVER_VERSION "0.9.13-370"
#define DRIVER_MAJOR 0
#define DRIVER_MINOR 9
-#define DRIVER_RELEASE 9
-#define DRIVER_REVISION 100
+#define DRIVER_RELEASE 13
+#define DRIVER_REVISION 370
#define DRIVER_NAME "Microsemi PQI Driver (v" DRIVER_VERSION ")"
#define DRIVER_NAME_SHORT "smartpqi"
^ permalink raw reply related [flat|nested] 22+ messages in thread
* Re: [PATCH V2 09/15] smartpqi: minor function reformating
2016-08-31 19:54 ` [PATCH V2 09/15] smartpqi: minor function reformating Don Brace
@ 2016-09-01 7:16 ` Johannes Thumshirn
0 siblings, 0 replies; 22+ messages in thread
From: Johannes Thumshirn @ 2016-09-01 7:16 UTC (permalink / raw)
To: Don Brace
Cc: jejb, john.hall, Kevin.Barnett, Mahesh.Rajashekhara, hch,
scott.teel, Viswas.G, Justin.Lindley, scott.benesh, elliott,
linux-scsi
On Wed, Aug 31, 2016 at 02:54:59PM -0500, Don Brace wrote:
> From: Kevin Barnett <kevin.barnett@microsemi.com>
>
> reformatted pqi_num_elements_free() to match the rest of the driver
>
> Reviewed-by: Scott Teel <scott.teel@microsemi.com>
> Reviewed-by: Scott Benesh <scott.benesh@microsemi.com>
> Reviewed-by: Tomas Henzl <thenzl@redhat.com>
> Signed-off-by: Kevin Barnett <kevin.barnett@microsemi.com>
> Signed-off-by: Don Brace <don.brace@microsemi.com>
> ---
Reviewed-by: Johannes Thumshirn <jthumshirn@suse.de>
--
Johannes Thumshirn Storage
jthumshirn@suse.de +49 911 74053 689
SUSE LINUX GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: Felix Imendörffer, Jane Smithard, Graham Norton
HRB 21284 (AG Nürnberg)
Key fingerprint = EC38 9CAB C2C4 F25D 8600 D0D0 0393 969D 2D76 0850
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH V2 15/15] smartqi: bump driver version
2016-08-31 19:55 ` [PATCH V2 15/15] smartqi: bump driver version Don Brace
@ 2016-09-01 7:17 ` Johannes Thumshirn
0 siblings, 0 replies; 22+ messages in thread
From: Johannes Thumshirn @ 2016-09-01 7:17 UTC (permalink / raw)
To: Don Brace
Cc: jejb, john.hall, Kevin.Barnett, Mahesh.Rajashekhara, hch,
scott.teel, Viswas.G, Justin.Lindley, scott.benesh, elliott,
linux-scsi
On Wed, Aug 31, 2016 at 02:55:36PM -0500, Don Brace wrote:
> From: Kevin Barnett <kevin.barnett@microsemi.com>
>
> Reviewed-by: Scott Teel <scott.teel@microsemi.com>
> Reviewed-by: Scott Benesh <scott.benesh@microsemi.com>
> Reviewed-by: Tomas Henzl <thenzl@redhat.com>
> Signed-off-by: Kevin Barnett <kevin.barnett@microsemi.com>
> Signed-off-by: Don Brace <don.brace@microsemi.com>
> ---
Reviewed-by: Johannes Thumshirn <jthumshirn@suse.de>
--
Johannes Thumshirn Storage
jthumshirn@suse.de +49 911 74053 689
SUSE LINUX GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: Felix Imendörffer, Jane Smithard, Graham Norton
HRB 21284 (AG Nürnberg)
Key fingerprint = EC38 9CAB C2C4 F25D 8600 D0D0 0393 969D 2D76 0850
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH V2 14/15] smartpqi: add smartpqi.txt
2016-08-31 19:55 ` [PATCH V2 14/15] smartpqi: add smartpqi.txt Don Brace
@ 2016-09-01 13:21 ` Tomas Henzl
0 siblings, 0 replies; 22+ messages in thread
From: Tomas Henzl @ 2016-09-01 13:21 UTC (permalink / raw)
To: Don Brace, jejb, john.hall, Kevin.Barnett, Mahesh.Rajashekhara,
hch, scott.teel, Viswas.G, Justin.Lindley, scott.benesh, elliott
Cc: linux-scsi
On 31.8.2016 21:55, Don Brace wrote:
> added Documentation/scsi/smartpqi.txt
>
> Reviewed-by: Kevin Barnett <kevin.barnett@microsemi.com>
> Reviewed-by: Scott Benesh <scott.benesh@microsemi.com>
> Reviewed-by: Johannes Thumshirn <jthumshirn@suse.de>
> Signed-off-by: Don Brace <don.brace@microsemi.com>
Reviewed-by: Tomas Henzl <thenzl@redhat.com>
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH V2 00/15] smartpqi update
2016-08-31 19:54 [PATCH V2 00/15] smartpqi update Don Brace
` (14 preceding siblings ...)
2016-08-31 19:55 ` [PATCH V2 15/15] smartqi: bump driver version Don Brace
@ 2016-09-02 10:30 ` Martin K. Petersen
2016-09-02 14:59 ` Don Brace
15 siblings, 1 reply; 22+ messages in thread
From: Martin K. Petersen @ 2016-09-02 10:30 UTC (permalink / raw)
To: Don Brace
Cc: jejb, john.hall, Kevin.Barnett, Mahesh.Rajashekhara, hch,
scott.teel, Viswas.G, Justin.Lindley, scott.benesh, elliott,
linux-scsi
>>>>> "Don" == Don Brace <don.brace@microsemi.com> writes:
Don,
Don> These changes are based on Linus's tree The changes are:
Please make sure you submit patches against my tree. Had to tweak a few
things by hand.
Applied series to 4.9/scsi-queue.
--
Martin K. Petersen Oracle Linux Engineering
^ permalink raw reply [flat|nested] 22+ messages in thread
* RE: [PATCH V2 00/15] smartpqi update
2016-09-02 10:30 ` [PATCH V2 00/15] smartpqi update Martin K. Petersen
@ 2016-09-02 14:59 ` Don Brace
2016-09-02 18:03 ` Martin K. Petersen
0 siblings, 1 reply; 22+ messages in thread
From: Don Brace @ 2016-09-02 14:59 UTC (permalink / raw)
To: Martin K. Petersen
Cc: jejb, John Hall, Kevin Barnett, Mahesh Rajashekhara, hch,
Scott Teel, Viswas G, Justin Lindley, Scott Benesh, elliott,
linux-scsi
Thank you for doing the tweaking.
I notice that the MAINTAINERS file got updated with the Documentation/scsi/smartpqi.txt, but smartpqi.txt was not added.
Wondering what I need to do to resolve this.
Thanks,
Don Brace
ESC - Smart Storage
Microsemi Corporation
> -----Original Message-----
> From: Martin K. Petersen [mailto:martin.petersen@oracle.com]
> Sent: Friday, September 02, 2016 5:31 AM
> To: Don Brace
> Cc: jejb@linux.vnet.ibm.com; John Hall; Kevin Barnett; Mahesh
> Rajashekhara; hch@infradead.org; Scott Teel; Viswas G; Justin Lindley; Scott
> Benesh; elliott@hpe.com; linux-scsi@vger.kernel.org
> Subject: Re: [PATCH V2 00/15] smartpqi update
>
> EXTERNAL EMAIL
>
>
> >>>>> "Don" == Don Brace <don.brace@microsemi.com> writes:
>
> Don,
>
> Don> These changes are based on Linus's tree The changes are:
>
> Please make sure you submit patches against my tree. Had to tweak a few
> things by hand.
>
> Applied series to 4.9/scsi-queue.
>
> --
> Martin K. Petersen Oracle Linux Engineering
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH V2 00/15] smartpqi update
2016-09-02 14:59 ` Don Brace
@ 2016-09-02 18:03 ` Martin K. Petersen
0 siblings, 0 replies; 22+ messages in thread
From: Martin K. Petersen @ 2016-09-02 18:03 UTC (permalink / raw)
To: Don Brace
Cc: Martin K. Petersen, jejb, John Hall, Kevin Barnett,
Mahesh Rajashekhara, hch, Scott Teel, Viswas G, Justin Lindley,
Scott Benesh, elliott, linux-scsi
>>>>> "Don" == Don Brace <don.brace@microsemi.com> writes:
Don,
Don> Thank you for doing the tweaking. I notice that the MAINTAINERS
Don> file got updated with the Documentation/scsi/smartpqi.txt, but
Don> smartpqi.txt was not added.
Peculiar. Will fix.
--
Martin K. Petersen Oracle Linux Engineering
^ permalink raw reply [flat|nested] 22+ messages in thread
end of thread, other threads:[~2016-09-02 18:04 UTC | newest]
Thread overview: 22+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-08-31 19:54 [PATCH V2 00/15] smartpqi update Don Brace
2016-08-31 19:54 ` [PATCH V2 01/15] smartpqi: change aio sg processing Don Brace
2016-08-31 19:54 ` [PATCH V2 02/15] smartpqi: change tmf macro names Don Brace
2016-08-31 19:54 ` [PATCH V2 03/15] smartpqi: simplify spanning Don Brace
2016-08-31 19:54 ` [PATCH V2 04/15] smartpqi: enhance drive offline informational message Don Brace
2016-08-31 19:54 ` [PATCH V2 05/15] smartpqi: enhance reset logic Don Brace
2016-08-31 19:54 ` [PATCH V2 06/15] smartpqi: add kdump support Don Brace
2016-08-31 19:54 ` [PATCH V2 07/15] smartpqi: correct controller offline issue Don Brace
2016-08-31 19:54 ` [PATCH V2 08/15] smartpqi: correct event acknowledgment timeout issue Don Brace
2016-08-31 19:54 ` [PATCH V2 09/15] smartpqi: minor function reformating Don Brace
2016-09-01 7:16 ` Johannes Thumshirn
2016-08-31 19:55 ` [PATCH V2 10/15] smartpqi: minor tweaks to update time support Don Brace
2016-08-31 19:55 ` [PATCH V2 11/15] smartpqi: scsi queuecommand cleanup Don Brace
2016-08-31 19:55 ` [PATCH V2 12/15] smartpqi: remove timeout for cache flush operations Don Brace
2016-08-31 19:55 ` [PATCH V2 13/15] smartpqi: update Kconfig Don Brace
2016-08-31 19:55 ` [PATCH V2 14/15] smartpqi: add smartpqi.txt Don Brace
2016-09-01 13:21 ` Tomas Henzl
2016-08-31 19:55 ` [PATCH V2 15/15] smartqi: bump driver version Don Brace
2016-09-01 7:17 ` Johannes Thumshirn
2016-09-02 10:30 ` [PATCH V2 00/15] smartpqi update Martin K. Petersen
2016-09-02 14:59 ` Don Brace
2016-09-02 18:03 ` Martin K. Petersen
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.