Dear Christophe, Thank you for your comments, Christophe JAILLET <christophe.jaillet@xxxxxxxxxx> 於 2024年12月12日 週四 上午12:44寫道: > > > +int nct6694_read_msg(struct nct6694 *nct6694, u8 mod, u16 offset, > > + u16 length, void *buf) > > +{ > > + struct nct6694_cmd_header *cmd_header = nct6694->cmd_header; > > + struct nct6694_response_header *response_header = nct6694->response_header; > > + struct usb_device *udev = nct6694->udev; > > + int tx_len, rx_len, ret; > > + > > + guard(mutex)(&nct6694->access_lock); > > Nitpick: This could be moved a few lines below, should it still comply > with your coding style. > I think the lock should be placed here to prevent the cmd_header from being overwritten by another caller. Could you share your perspective on this? > > + > > + /* Send command packet to USB device */ > > + cmd_header->mod = mod; > > + cmd_header->cmd = offset & 0xFF; > > + cmd_header->sel = (offset >> 8) & 0xFF; > > + cmd_header->hctrl = NCT6694_HCTRL_GET; > > + cmd_header->len = length; > > + > > + ret = usb_bulk_msg(udev, usb_sndbulkpipe(udev, NCT6694_BULK_OUT_EP), > > + cmd_header, NCT6694_CMD_PACKET_SZ, &tx_len, > > + nct6694->timeout); > > + if (ret) > > + return ret; > > + > > + /* Receive response packet from USB device */ > > + ret = usb_bulk_msg(udev, usb_rcvbulkpipe(udev, NCT6694_BULK_IN_EP), > > + response_header, NCT6694_CMD_PACKET_SZ, &rx_len, > > + nct6694->timeout); > > + if (ret) > > + return ret; > > + > > + ret = usb_bulk_msg(udev, usb_rcvbulkpipe(udev, NCT6694_BULK_IN_EP), > > + buf, NCT6694_MAX_PACKET_SZ, &rx_len, nct6694->timeout); > > + if (ret) > > + return ret; > > + > > + return nct6694_response_err_handling(nct6694, response_header->sts); > > +} > > +EXPORT_SYMBOL(nct6694_read_msg); > > + > > +int nct6694_write_msg(struct nct6694 *nct6694, u8 mod, u16 offset, > > + u16 length, void *buf) > > +{ > > + struct nct6694_cmd_header *cmd_header = nct6694->cmd_header; > > + struct nct6694_response_header *response_header = nct6694->response_header; > > + struct usb_device *udev = nct6694->udev; > > + int tx_len, rx_len, ret; > > + > > + guard(mutex)(&nct6694->access_lock); > > Nitpick: This could be moved a few lines below, should it still comply > with your coding style. > I think the lock should be placed here to prevent the cmd_header from being overwritten by another caller. Could you share your perspective on this? > > + > > + /* Send command packet to USB device */ > > Nitpick: double space before */ > Fix it in v4. > > + cmd_header->mod = mod; > > + cmd_header->cmd = offset & 0xFF; > > + cmd_header->sel = (offset >> 8) & 0xFF; > > + cmd_header->hctrl = NCT6694_HCTRL_SET; > > + cmd_header->len = length; > > ... > > > +static struct irq_chip nct6694_irq_chip = { > > const? > Fix it in v4. > > + .name = "nct6694-irq", > > + .flags = IRQCHIP_SKIP_SET_WAKE, > > + .irq_bus_lock = nct6694_irq_lock, > > + .irq_bus_sync_unlock = nct6694_irq_sync_unlock, > > + .irq_enable = nct6694_irq_enable, > > + .irq_disable = nct6694_irq_disable, > > +}; > > ... > > > +static int nct6694_usb_probe(struct usb_interface *iface, > > + const struct usb_device_id *id) > > +{ > > + struct usb_device *udev = interface_to_usbdev(iface); > > + struct device *dev = &udev->dev; > > + struct usb_host_interface *interface; > > + struct usb_endpoint_descriptor *int_endpoint; > > + struct nct6694 *nct6694; > > + struct nct6694_cmd_header *cmd_header; > > + struct nct6694_response_header *response_header; > > + int pipe, maxp; > > + int ret; > > + > > + interface = iface->cur_altsetting; > > + > > + int_endpoint = &interface->endpoint[0].desc; > > + if (!usb_endpoint_is_int_in(int_endpoint)) > > + return -ENODEV; > > + > > + nct6694 = devm_kzalloc(dev, sizeof(*nct6694), GFP_KERNEL); > > + if (!nct6694) > > + return -ENOMEM; > > + > > + pipe = usb_rcvintpipe(udev, NCT6694_INT_IN_EP); > > + maxp = usb_maxpacket(udev, pipe); > > + > > + cmd_header = devm_kzalloc(dev, sizeof(*cmd_header), > > + GFP_KERNEL); > > + if (!cmd_header) > > + return -ENOMEM; > > + > > + response_header = devm_kzalloc(dev, sizeof(*response_header), > > + GFP_KERNEL); > > + if (!response_header) > > + return -ENOMEM; > > + > > + nct6694->int_buffer = devm_kcalloc(dev, NCT6694_MAX_PACKET_SZ, > > + sizeof(unsigned char), GFP_KERNEL); > > Why for cmd_header and response_header we use a temp variable, while > here we update directly nct6694->int_buffer? > > It would save a few LoC do remove this temp var. > Fix it in v4. > > + if (!nct6694->int_buffer) > > + return -ENOMEM; > > + > > + nct6694->int_in_urb = usb_alloc_urb(0, GFP_KERNEL); > > + if (!nct6694->int_in_urb) > > + return -ENOMEM; > > ... > Best regards, Ming