/* Write the command to mailbox 0. */
writel(cmd, ®isters->sis_mailbox[0]);
/* * Write the command parameters to mailboxes 1-4 (mailbox 5 is not used * when sending a command to the controller).
*/ for (i = 1; i <= 4; i++)
writel(params->mailbox[i], ®isters->sis_mailbox[i]);
/* Clear the command doorbell. */
writel(SIS_CLEAR_CTRL_TO_HOST_DOORBELL,
®isters->sis_ctrl_to_host_doorbell_clear);
/* Disable doorbell interrupts by masking all interrupts. */
writel(~0, ®isters->sis_interrupt_mask);
usleep_range(1000, 2000);
/* * Force the completion of the interrupt mask register write before * submitting the command.
*/
readl(®isters->sis_interrupt_mask);
/* Submit the command to the controller. */
writel(SIS_CMD_READY, ®isters->sis_host_to_ctrl_doorbell);
/* * Poll for command completion. Note that the call to msleep() is at * the top of the loop in order to give the controller time to start * processing the command before we start polling.
*/
timeout = (SIS_CMD_COMPLETE_TIMEOUT_SECS * HZ) + jiffies; while (1) {
msleep(SIS_CMD_COMPLETE_POLL_INTERVAL_MSECS);
doorbell = readl(®isters->sis_ctrl_to_host_doorbell); if (doorbell & SIS_CMD_COMPLETE) break; if (time_after(jiffies, timeout)) return -ETIMEDOUT;
}
/* Read the command status from mailbox 0. */
cmd_status = readl(®isters->sis_mailbox[0]); if (cmd_status != SIS_CMD_STATUS_SUCCESS) {
dev_err(&ctrl_info->pci_dev->dev, "SIS command failed for command 0x%x: status = 0x%x\n",
cmd, cmd_status); return -EINVAL;
}
/* * The command completed successfully, so save the command status and * read the values returned in mailboxes 1-5.
*/
params->mailbox[0] = cmd_status; for (i = 1; i < ARRAY_SIZE(params->mailbox); i++)
params->mailbox[i] = readl(®isters->sis_mailbox[i]);
return0;
}
/* * This function verifies that we are talking to a controller that speaks PQI.
*/
int sis_get_ctrl_properties(struct pqi_ctrl_info *ctrl_info)
{ int rc;
u32 properties;
u32 extended_properties; struct sis_sync_cmd_params params;
memset(¶ms, 0, sizeof(params));
rc = sis_send_sync_cmd(ctrl_info, SIS_CMD_GET_ADAPTER_PROPERTIES,
¶ms); if (rc) return rc;
properties = params.mailbox[1];
if (!(properties & SIS_EXTENDED_PROPERTIES_SUPPORTED)) return -ENODEV;
extended_properties = params.mailbox[4];
if ((extended_properties & SIS_REQUIRED_EXTENDED_PROPERTIES) !=
SIS_REQUIRED_EXTENDED_PROPERTIES) return -ENODEV;
if (extended_properties & SIS_PQI_RESET_QUIESCE_SUPPORTED)
ctrl_info->pqi_reset_quiesce_supported = true;
return0;
}
int sis_get_pqi_capabilities(struct pqi_ctrl_info *ctrl_info)
{ int rc; struct sis_sync_cmd_params params;
memset(¶ms, 0, sizeof(params));
rc = sis_send_sync_cmd(ctrl_info, SIS_CMD_GET_PQI_CAPABILITIES,
¶ms); if (rc) return rc;
int sis_wait_for_ctrl_logging_completion(struct pqi_ctrl_info *ctrl_info)
{ int rc; enum sis_ctrl_logging_status status; unsignedlong timeout;
timeout = (SIS_CTRL_LOGGING_STATUS_TIMEOUT_SECS * HZ) + jiffies; while (1) {
status = sis_read_ctrl_logging_status(ctrl_info); if (status == CTRL_LOGGING_COND_INVALID) {
dev_err(&ctrl_info->pci_dev->dev, "controller data logging condition invalid\n");
rc = -EINVAL; break;
} elseif (status == CTRL_LOGGING_COMPLETED) {
rc = 0; break;
}
if (time_after(jiffies, timeout)) {
dev_err(&ctrl_info->pci_dev->dev, "timed out waiting for controller data logging status\n");
rc = -ETIMEDOUT; break;
}
¤ Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.0.16Bemerkung:
(vorverarbeitet am 2026-06-07)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.