static bool pvscsi_setup_req_threshold(struct pvscsi_adapter *adapter, bool enable) { u32 val; if (!pvscsi_use_req_threshold) return false; pvscsi_reg_write(adapter, PVSCSI_REG_OFFSET_COMMAND, PVSCSI_CMD_SETUP_REQCALLTHRESHOLD); val = pvscsi_reg_read(adapter, PVSCSI_REG_OFFSET_COMMAND_STATUS); if (val == -1) { printk(KERN_INFO "vmw_pvscsi: device does not support req_threshold\n"); return false; } else { struct PVSCSICmdDescSetupReqCall cmd_msg = { 0 }; cmd_msg.enable = enable; printk(KERN_INFO "vmw_pvscsi: %sabling reqCallThreshold\n", enable ? "en" : "dis"); pvscsi_write_cmd_desc(adapter, PVSCSI_CMD_SETUP_REQCALLTHRESHOLD, &cmd_msg, sizeof(cmd_msg)); return pvscsi_reg_read(adapter, PVSCSI_REG_OFFSET_COMMAND_STATUS) != 0; } }
static int pvscsi_setup_msg_workqueue(struct pvscsi_adapter *adapter) { char name[32]; if (!pvscsi_use_msg) return 0; pvscsi_reg_write(adapter, PVSCSI_REG_OFFSET_COMMAND, PVSCSI_CMD_SETUP_MSG_RING); if (pvscsi_reg_read(adapter, PVSCSI_REG_OFFSET_COMMAND_STATUS) == -1) return 0; snprintf(name, sizeof(name), "vmw_pvscsi_wq_%u", adapter->host->host_no); adapter->workqueue = create_singlethread_workqueue(name); if (!adapter->workqueue) { printk(KERN_ERR "vmw_pvscsi: failed to create work queue\n"); return 0; } INIT_WORK(&adapter->work, pvscsi_msg_workqueue_handler); return 1; }
static u32 pvscsi_read_intr_status(const struct pvscsi_adapter *adapter) { return pvscsi_reg_read(adapter, PVSCSI_REG_OFFSET_INTR_STATUS); }