fix /dev/dmj-* chardevs not appearing when not in mode 1

This commit is contained in:
Triss 2021-07-25 19:47:22 +02:00
parent 2823f33039
commit e67c4ea8e6
3 changed files with 19 additions and 9 deletions

View File

@ -1,2 +1,3 @@
#!/bin/sh #!/bin/sh
cd "$(dirname "$(realpath "$0")")"
exec python3 -m dmctl "$@" exec python3 -m dmctl "$@"

View File

@ -59,6 +59,7 @@ static ssize_t dmj_char_read(struct file *file, char *buf, size_t len, loff_t *l
/* no flags: act like libusb read */ /* no flags: act like libusb read */
res = dmj_transfer(dmjch->pdev, -1, 0/*DMJ_XFER_FLAGS_FILL_RECVBUF*/, NULL, 0, &kbuf, &ilen); res = dmj_transfer(dmjch->pdev, -1, 0/*DMJ_XFER_FLAGS_FILL_RECVBUF*/, NULL, 0, &kbuf, &ilen);
if (res < 0 || ilen < 0 || !kbuf) { if (res < 0 || ilen < 0 || !kbuf) {
//dev_warn(dev, "err res=%d ilen=%d kbuf=%p\n", res, ilen, kbuf);
if (kbuf) kfree(kbuf); if (kbuf) kfree(kbuf);
return (res >= 0) ? -EIO : ret; return (res >= 0) ? -EIO : ret;
} }

View File

@ -227,7 +227,10 @@ int dmj_xfer_internal(struct dmj_dev *dmj, int cmd, int recvflags,
* will error when going beyond!). also done in 64b chunks * will error when going beyond!). also done in 64b chunks
*/ */
if (!rbufsize || *rbufsize <= 0) return 0; if (!rbufsize || *rbufsize <= 0) {
//dev_warn(dev, "no rbuf\n");
return 0;
}
if (recvflags & DMJ_XFER_FLAGS_FILL_RECVBUF) { if (recvflags & DMJ_XFER_FLAGS_FILL_RECVBUF) {
tmpbuf = kmalloc(64, GFP_KERNEL); tmpbuf = kmalloc(64, GFP_KERNEL);
@ -265,7 +268,10 @@ int dmj_xfer_internal(struct dmj_dev *dmj, int cmd, int recvflags,
ret = usb_bulk_msg(dmj->usb_dev, usb_rcvbulkpipe(dmj->usb_dev, dmj->ep_in), ret = usb_bulk_msg(dmj->usb_dev, usb_rcvbulkpipe(dmj->usb_dev, dmj->ep_in),
longbuf, *rbufsize, rbufsize, DMJ_USB_TIMEOUT); longbuf, *rbufsize, rbufsize, DMJ_USB_TIMEOUT);
if (ret < 0) goto err_freelong; if (ret < 0) goto err_freelong;
if (*rbufsize < 0) ret = -EREMOTEIO; goto err_freelong; if (*rbufsize < 0) {
//dev_warn(dev, "remoteio\n");
ret = -EREMOTEIO; goto err_freelong;
}
ret = 0; ret = 0;
*rbuf = longbuf; *rbuf = longbuf;
@ -450,8 +456,10 @@ static int dmj_probe(struct usb_interface *itf, const struct usb_device_id *usb_
struct dmj_dev *dmj; struct dmj_dev *dmj;
int ret, i; int ret, i;
if (hostitf->desc.bNumEndpoints < 2) if (hostitf->desc.bNumEndpoints < 2) {
dev_warn(dev, "not enough endpoints!\n");
return -ENODEV; return -ENODEV;
}
for (i = 0; i < hostitf->desc.bNumEndpoints; ++i) { for (i = 0; i < hostitf->desc.bNumEndpoints; ++i) {
curep = &hostitf->endpoint[i].desc; curep = &hostitf->endpoint[i].desc;
@ -488,13 +496,13 @@ static int dmj_probe(struct usb_interface *itf, const struct usb_device_id *usb_
goto out_free; goto out_free;
} }
if (dmj->dmj_mode == 1) { ret = mfd_add_hotplug_devices(dev, dmj_mfd_char, ARRAY_SIZE(dmj_mfd_char));
ret = mfd_add_hotplug_devices(dev, dmj_mfd_char, ARRAY_SIZE(dmj_mfd_char)); if (ret) {
if (ret) { dev_err(dev, "failed to add MFD character devices\n");
dev_err(dev, "failed to add MFD character devices\n"); goto out_free;
goto out_free; }
}
if (dmj->dmj_mode == 1) {
if (dmj->dmj_m1feature & DMJ_FEATURE_MODE1_SPI) { if (dmj->dmj_m1feature & DMJ_FEATURE_MODE1_SPI) {
ret = mfd_add_hotplug_devices(dev, dmj_mfd_spi, ARRAY_SIZE(dmj_mfd_spi)); ret = mfd_add_hotplug_devices(dev, dmj_mfd_spi, ARRAY_SIZE(dmj_mfd_spi));
if (ret) { if (ret) {