[PATCH OLK-6.6] LeapIOraid: add device and support fw log

LeapIO inclusion category: feature bugzilla: https://gitee.com/openeuler/kernel/issues/ICIKQI ------------------------------------------ add device and support fw log Signed-off-by: haodongdong <doubled@leap-io.com> --- drivers/scsi/leapioraid/leapioraid_app.c | 28 +++++++ drivers/scsi/leapioraid/leapioraid_func.c | 79 +++++++------------ drivers/scsi/leapioraid/leapioraid_func.h | 6 +- drivers/scsi/leapioraid/leapioraid_os.c | 2 + .../scsi/leapioraid/leapioraid_transport.c | 8 +- 5 files changed, 69 insertions(+), 54 deletions(-) diff --git a/drivers/scsi/leapioraid/leapioraid_app.c b/drivers/scsi/leapioraid/leapioraid_app.c index 6e7f6bf877782..039b4d8ffd027 100644 --- a/drivers/scsi/leapioraid/leapioraid_app.c +++ b/drivers/scsi/leapioraid/leapioraid_app.c @@ -2188,6 +2188,33 @@ const struct attribute_group *leapioraid_dev_groups[] = { NULL }; +static int my_mmap(struct file *filp, struct vm_area_struct *vma) +{ + struct LEAPIORAID_ADAPTER *ioc; + unsigned long pfn; + unsigned long length = vma->vm_end - vma->vm_start; + + ioc = list_first_entry(&leapioraid_ioc_list, + struct LEAPIORAID_ADAPTER, list); + if (length > (SYS_LOG_BUF_SIZE + SYS_LOG_BUF_RESERVE)) { + pr_err("Requested mapping size is too large\n"); + return -EINVAL; + } + if (ioc->log_buffer == NULL) { + pr_err("no log buffer\n"); + return -EINVAL; + } + + pfn = virt_to_phys(ioc->log_buffer) >> PAGE_SHIFT; + + if (remap_pfn_range(vma, vma->vm_start, pfn, length, vma->vm_page_prot)) { + pr_err("Failed to map memory to user space\n"); + return -EAGAIN; + } + + return 0; +} + static const struct file_operations leapioraid_ctl_fops = { .owner = THIS_MODULE, @@ -2197,6 +2224,7 @@ file_operations leapioraid_ctl_fops = { #ifdef CONFIG_COMPAT .compat_ioctl = leapioraid_ctl_ioctl_compat, #endif + .mmap = my_mmap, }; static struct miscdevice leapioraid_ctl_dev = { diff --git a/drivers/scsi/leapioraid/leapioraid_func.c b/drivers/scsi/leapioraid/leapioraid_func.c index 97e0f893ab4c5..19fe5e96a9add 100644 --- a/drivers/scsi/leapioraid/leapioraid_func.c +++ b/drivers/scsi/leapioraid/leapioraid_func.c @@ -315,66 +315,38 @@ leapioraid_udp_exit(void) sock_release(sock); } -static int -leapioraid_send_udp_pkg(void *buf, U32 datasize) +struct info { - int ret; - struct kvec vec; - - vec.iov_len = datasize; - vec.iov_base = buf; - ret = kernel_sendmsg(sock, &msg, &vec, 1, vec.iov_len); - if (ret <= 0) { - pr_err_ratelimited("Sending UDP packet failed: errorno = %d", - ret); - return 0; - } else { - return ret; - } -} + u32 user_position; + u32 ioc_position; +}; +int cooo; static void leapioraid_base_pcie_log_work(struct work_struct *work) { struct LEAPIORAID_ADAPTER *ioc = - container_of(work, struct LEAPIORAID_ADAPTER, pcie_log_work.work); + container_of(work, + struct LEAPIORAID_ADAPTER, pcie_log_work.work); unsigned long flags; - u32 host_logbuf_position, ioc_logbuf_position; - u32 datasize, offset, send_sz, actual_send_sz; - - while (true) { - host_logbuf_position = - ioc->base_readl(&ioc->chip->HostLogBufPosition, 0); - ioc_logbuf_position = - ioc->base_readl(&ioc->chip->IocLogBufPosition, 0); - datasize = ioc_logbuf_position - host_logbuf_position; - offset = host_logbuf_position % SYS_LOG_BUF_SIZE; - if (datasize == 0) { - goto rearm_timer; - } else if (datasize > SYS_LOG_BUF_SIZE) { - pr_err("log thread error:data size overflow\n"); - return; - } + struct info *infom = (struct info *)(ioc->log_buffer + SYS_LOG_BUF_SIZE); - if (offset + datasize > SYS_LOG_BUF_SIZE) - send_sz = SYS_LOG_BUF_SIZE - offset; - else - send_sz = datasize; + if (cooo == 0) { + infom->user_position = + ioc->base_readl(&ioc->chip->HostLogBufPosition, 0); + infom->ioc_position = + ioc->base_readl(&ioc->chip->IocLogBufPosition, 0); + cooo++; + } - if (send_sz > MAX_UPD_PAYLOAD_SZ) - send_sz = MAX_UPD_PAYLOAD_SZ; + writel(infom->user_position, &ioc->chip->HostLogBufPosition); + infom->ioc_position = ioc->base_readl(&ioc->chip->IocLogBufPosition, 0); - actual_send_sz = - leapioraid_send_udp_pkg(ioc->log_buffer + offset, send_sz); - host_logbuf_position += actual_send_sz; - writel(host_logbuf_position, &ioc->chip->HostLogBufPosition); - } -rearm_timer: spin_lock_irqsave(&ioc->ioc_reset_in_progress_lock, flags); if (ioc->pcie_log_work_q) queue_delayed_work(ioc->pcie_log_work_q, - &ioc->pcie_log_work, - msecs_to_jiffies(LEAPIORAID_LOG_POLLING_INTERVAL)); + &ioc->pcie_log_work, + msecs_to_jiffies(LEAPIORAID_LOG_POLLING_INTERVAL)); spin_unlock_irqrestore(&ioc->ioc_reset_in_progress_lock, flags); } @@ -4786,9 +4758,18 @@ leapioraid_base_trace_log_init(struct LEAPIORAID_ADAPTER *ioc) pr_info("%s %s\n", ioc->name, __func__)); if (ioc->log_buffer == NULL) { ioc->log_buffer = - dma_alloc_coherent(&ioc->pdev->dev, SYS_LOG_BUF_SIZE, - &ioc->log_buffer_dma, GFP_KERNEL); + dma_alloc_coherent(&ioc->pdev->dev, + (SYS_LOG_BUF_SIZE + SYS_LOG_BUF_RESERVE), + &ioc->log_buffer_dma, GFP_KERNEL); + if (!ioc->log_buffer) { + pr_err("%s: Failed to allocate log_buffer at %s:%d/%s()!\n", + ioc->name, __FILE__, __LINE__, __func__); + return -ENOMEM; + } + } + memset(ioc->log_buffer, 0, (SYS_LOG_BUF_SIZE + SYS_LOG_BUF_RESERVE)); + memset(&mpi_request, 0, sizeof(struct LeapioraidIOCLogReq_t)); mpi_request.Function = LEAPIORAID_FUNC_LOG_INIT; mpi_request.BufAddr = ioc->log_buffer_dma; diff --git a/drivers/scsi/leapioraid/leapioraid_func.h b/drivers/scsi/leapioraid/leapioraid_func.h index 76babcb40766c..a4beb1412d666 100644 --- a/drivers/scsi/leapioraid/leapioraid_func.h +++ b/drivers/scsi/leapioraid/leapioraid_func.h @@ -61,7 +61,9 @@ #define fallthrough #endif -#define SYS_LOG_BUF_SIZE (0x20000) +#define SYS_LOG_BUF_SIZE (0x200000) //2M +#define SYS_LOG_BUF_RESERVE (0x1000) //256 + #define MAX_UPD_PAYLOAD_SZ (0x4000) #define LEAPIORAID_DRIVER_NAME "LeapIoRaid" @@ -76,6 +78,8 @@ #define LEAPIORAID_VENDOR_ID (0xD405) #define LEAPIORAID_DEVICE_ID_1 (0x1000) #define LEAPIORAID_DEVICE_ID_2 (0x1001) +#define LEAPIORAID_HBA (0x8200) +#define LEAPIORAID_RAID (0x8201) #define LEAPIORAID_MAX_PHYS_SEGMENTS SG_CHUNK_SIZE diff --git a/drivers/scsi/leapioraid/leapioraid_os.c b/drivers/scsi/leapioraid/leapioraid_os.c index 368a3c859a04b..bb3ef15dec0a2 100644 --- a/drivers/scsi/leapioraid/leapioraid_os.c +++ b/drivers/scsi/leapioraid/leapioraid_os.c @@ -9685,6 +9685,8 @@ static const struct pci_device_id leapioraid_pci_table[] = { { 0x1556, 0x1111, PCI_ANY_ID, PCI_ANY_ID }, { LEAPIORAID_VENDOR_ID, LEAPIORAID_DEVICE_ID_1, PCI_ANY_ID, PCI_ANY_ID }, { LEAPIORAID_VENDOR_ID, LEAPIORAID_DEVICE_ID_2, PCI_ANY_ID, PCI_ANY_ID }, + { LEAPIORAID_VENDOR_ID, LEAPIORAID_HBA, PCI_ANY_ID, PCI_ANY_ID }, + { LEAPIORAID_VENDOR_ID, LEAPIORAID_RAID, PCI_ANY_ID, PCI_ANY_ID }, { 0 } }; diff --git a/drivers/scsi/leapioraid/leapioraid_transport.c b/drivers/scsi/leapioraid/leapioraid_transport.c index e7ff263a8b6e7..edddd56128a19 100644 --- a/drivers/scsi/leapioraid/leapioraid_transport.c +++ b/drivers/scsi/leapioraid/leapioraid_transport.c @@ -852,8 +852,8 @@ leapioraid_transport_port_remove(struct LEAPIORAID_ADAPTER *ioc, list_for_each_entry_safe(leapioraid_phy, next_phy, &leapioraid_port->phy_list, port_siblings) { if ((ioc->logging_level & LEAPIORAID_DEBUG_TRANSPORT)) - dev_info(&leapioraid_port->port->dev, - "remove: sas_addr(0x%016llx), phy(%d)\n", + pr_info("%s %s: remove: sas_addr(0x%016llx), phy(%d)\n", + ioc->name, __func__, (unsigned long long) leapioraid_port->remote_identify.sas_address, leapioraid_phy->phy_id); @@ -869,8 +869,8 @@ leapioraid_transport_port_remove(struct LEAPIORAID_ADAPTER *ioc, ioc->name, __func__, (unsigned long long)sas_address); #else if ((ioc->logging_level & LEAPIORAID_DEBUG_TRANSPORT)) - dev_info(&leapioraid_port->rphy->dev, - "remove: sas_addr(0x%016llx)\n", + pr_info("%s %s: remove: sas_addr(0x%016llx)\n", + ioc->name, __func__, (unsigned long long)sas_address); if (!ioc->remove_host) sas_rphy_delete(leapioraid_port->rphy); -- 2.25.1

反馈: 您发送到kernel@openeuler.org的补丁/补丁集,已成功转换为PR! PR链接地址: https://gitee.com/openeuler/kernel/pulls/16844 邮件列表地址:https://mailweb.openeuler.org/archives/list/kernel@openeuler.org/message/GFG... FeedBack: The patch(es) which you have sent to kernel@openeuler.org mailing list has been converted to a pull request successfully! Pull request link: https://gitee.com/openeuler/kernel/pulls/16844 Mailing list address: https://mailweb.openeuler.org/archives/list/kernel@openeuler.org/message/GFG...
participants (2)
-
haodongdong
-
patchwork bot