Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge tag 'char-misc-5.19-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc

Pull char/misc driver fixes from Greg KH:
"Here are four small char/misc driver fixes for 5.19-rc6 to resolve
some reported issues. They only affect two drivers:

- rtsx_usb: fix for of-reported DMA warning error, the driver was
handling memory buffers in odd ways, it has now been fixed up to be
much simpler and correct by Shuah.

- at25 eeprom driver bugfix for reported problem

All of these have been in linux-next for a week with no reported
problems"

* tag 'char-misc-5.19-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc:
misc: rtsx_usb: set return value in rsp_buf alloc err path
misc: rtsx_usb: use separate command and response buffers
misc: rtsx_usb: fix use of dma mapped buffer for usb bulk transfer
eeprom: at25: Rework buggy read splitting

+31 -24
+19 -8
drivers/misc/cardreader/rtsx_usb.c
··· 631 631 632 632 ucr->pusb_dev = usb_dev; 633 633 634 - ucr->iobuf = usb_alloc_coherent(ucr->pusb_dev, IOBUF_SIZE, 635 - GFP_KERNEL, &ucr->iobuf_dma); 636 - if (!ucr->iobuf) 634 + ucr->cmd_buf = kmalloc(IOBUF_SIZE, GFP_KERNEL); 635 + if (!ucr->cmd_buf) 637 636 return -ENOMEM; 637 + 638 + ucr->rsp_buf = kmalloc(IOBUF_SIZE, GFP_KERNEL); 639 + if (!ucr->rsp_buf) { 640 + ret = -ENOMEM; 641 + goto out_free_cmd_buf; 642 + } 638 643 639 644 usb_set_intfdata(intf, ucr); 640 645 641 646 ucr->vendor_id = id->idVendor; 642 647 ucr->product_id = id->idProduct; 643 - ucr->cmd_buf = ucr->rsp_buf = ucr->iobuf; 644 648 645 649 mutex_init(&ucr->dev_mutex); 646 650 ··· 672 668 673 669 out_init_fail: 674 670 usb_set_intfdata(ucr->pusb_intf, NULL); 675 - usb_free_coherent(ucr->pusb_dev, IOBUF_SIZE, ucr->iobuf, 676 - ucr->iobuf_dma); 671 + kfree(ucr->rsp_buf); 672 + ucr->rsp_buf = NULL; 673 + out_free_cmd_buf: 674 + kfree(ucr->cmd_buf); 675 + ucr->cmd_buf = NULL; 677 676 return ret; 678 677 } 679 678 ··· 689 682 mfd_remove_devices(&intf->dev); 690 683 691 684 usb_set_intfdata(ucr->pusb_intf, NULL); 692 - usb_free_coherent(ucr->pusb_dev, IOBUF_SIZE, ucr->iobuf, 693 - ucr->iobuf_dma); 685 + 686 + kfree(ucr->cmd_buf); 687 + ucr->cmd_buf = NULL; 688 + 689 + kfree(ucr->rsp_buf); 690 + ucr->rsp_buf = NULL; 694 691 } 695 692 696 693 #ifdef CONFIG_PM
+12 -14
drivers/misc/eeprom/at25.c
··· 80 80 struct at25_data *at25 = priv; 81 81 char *buf = val; 82 82 size_t max_chunk = spi_max_transfer_size(at25->spi); 83 - size_t num_msgs = DIV_ROUND_UP(count, max_chunk); 84 - size_t nr_bytes = 0; 85 - unsigned int msg_offset; 86 - size_t msg_count; 83 + unsigned int msg_offset = offset; 84 + size_t bytes_left = count; 85 + size_t segment; 87 86 u8 *cp; 88 87 ssize_t status; 89 88 struct spi_transfer t[2]; ··· 96 97 if (unlikely(!count)) 97 98 return -EINVAL; 98 99 99 - msg_offset = (unsigned int)offset; 100 - msg_count = min(count, max_chunk); 101 - while (num_msgs) { 100 + do { 101 + segment = min(bytes_left, max_chunk); 102 102 cp = at25->command; 103 103 104 104 instr = AT25_READ; ··· 129 131 t[0].len = at25->addrlen + 1; 130 132 spi_message_add_tail(&t[0], &m); 131 133 132 - t[1].rx_buf = buf + nr_bytes; 133 - t[1].len = msg_count; 134 + t[1].rx_buf = buf; 135 + t[1].len = segment; 134 136 spi_message_add_tail(&t[1], &m); 135 137 136 138 status = spi_sync(at25->spi, &m); ··· 140 142 if (status) 141 143 return status; 142 144 143 - --num_msgs; 144 - msg_offset += msg_count; 145 - nr_bytes += msg_count; 146 - } 145 + msg_offset += segment; 146 + buf += segment; 147 + bytes_left -= segment; 148 + } while (bytes_left > 0); 147 149 148 150 dev_dbg(&at25->spi->dev, "read %zu bytes at %d\n", 149 151 count, offset); ··· 227 229 do { 228 230 unsigned long timeout, retries; 229 231 unsigned segment; 230 - unsigned offset = (unsigned) off; 232 + unsigned offset = off; 231 233 u8 *cp = bounce; 232 234 int sr; 233 235 u8 instr;
-2
include/linux/rtsx_usb.h
··· 54 54 struct usb_device *pusb_dev; 55 55 struct usb_interface *pusb_intf; 56 56 struct usb_sg_request current_sg; 57 - unsigned char *iobuf; 58 - dma_addr_t iobuf_dma; 59 57 60 58 struct timer_list sg_timer; 61 59 struct mutex dev_mutex;