@@ -32,7 +32,7 @@
unsigned int rtsx_stor_access_xfer_buf(unsigned char *buffer,
unsigned int buflen,
struct scsi_cmnd *srb,
- unsigned int *index,
+ struct scatterlist **sg,
unsigned int *offset,
enum xfer_buf_dir dir)
{
@@ -60,23 +60,20 @@ unsigned int rtsx_stor_access_xfer_buf(unsigned char *buffer,
* each page has to be kmap()'ed separately.
*/
} else {
- struct scatterlist *sg =
- (struct scatterlist *)scsi_sglist(srb)
- + *index;
-
/*
* This loop handles a single s-g list entry, which may
* include multiple pages. Find the initial page structure
* and the starting offset within the page, and update
- * the *offset and *index values for the next loop.
+ * the *offset and current sg for the next loop.
*/
cnt = 0;
- while (cnt < buflen && *index < scsi_sg_count(srb)) {
- struct page *page = sg_page(sg) +
- ((sg->offset + *offset) >> PAGE_SHIFT);
- unsigned int poff = (sg->offset + *offset) &
+ while (cnt < buflen && *sg) {
+ struct page *page = sg_page(*sg) +
+ (((*sg)->offset + *offset) >>
+ PAGE_SHIFT);
+ unsigned int poff = ((*sg)->offset + *offset) &
(PAGE_SIZE - 1);
- unsigned int sglen = sg->length - *offset;
+ unsigned int sglen = (*sg)->length - *offset;
if (sglen > buflen - cnt) {
/* Transfer ends within this s-g entry */
@@ -85,8 +82,7 @@ unsigned int rtsx_stor_access_xfer_buf(unsigned char *buffer,
} else {
/* Transfer continues to next s-g entry */
*offset = 0;
- ++*index;
- ++sg;
+ *sg = sg_next(*sg);
}
while (sglen > 0) {
@@ -120,9 +116,10 @@ unsigned int rtsx_stor_access_xfer_buf(unsigned char *buffer,
void rtsx_stor_set_xfer_buf(unsigned char *buffer,
unsigned int buflen, struct scsi_cmnd *srb)
{
- unsigned int index = 0, offset = 0;
+ unsigned int offset = 0;
+ struct scatterlist *sg = scsi_sglist(srb);
- rtsx_stor_access_xfer_buf(buffer, buflen, srb, &index, &offset,
+ rtsx_stor_access_xfer_buf(buffer, buflen, srb, &sg, &offset,
TO_XFER_BUF);
if (buflen < scsi_bufflen(srb))
scsi_set_resid(srb, scsi_bufflen(srb) - buflen);
@@ -131,9 +128,10 @@ void rtsx_stor_set_xfer_buf(unsigned char *buffer,
void rtsx_stor_get_xfer_buf(unsigned char *buffer,
unsigned int buflen, struct scsi_cmnd *srb)
{
- unsigned int index = 0, offset = 0;
+ unsigned int offset = 0;
+ struct scatterlist *sg = scsi_sglist(srb);
- rtsx_stor_access_xfer_buf(buffer, buflen, srb, &index, &offset,
+ rtsx_stor_access_xfer_buf(buffer, buflen, srb, &sg, &offset,
FROM_XFER_BUF);
if (buflen < scsi_bufflen(srb))
scsi_set_resid(srb, scsi_bufflen(srb) - buflen);
@@ -20,7 +20,7 @@
unsigned int rtsx_stor_access_xfer_buf(unsigned char *buffer,
unsigned int buflen,
struct scsi_cmnd *srb,
- unsigned int *index,
+ struct scatterlist **sg,
unsigned int *offset,
enum xfer_buf_dir dir);
void rtsx_stor_set_xfer_buf(unsigned char *buffer, unsigned int buflen,
@@ -554,7 +554,8 @@ int spi_read_flash_id(struct scsi_cmnd *srb, struct rtsx_chip *chip)
int spi_read_flash(struct scsi_cmnd *srb, struct rtsx_chip *chip)
{
int retval;
- unsigned int index = 0, offset = 0;
+ unsigned int offset = 0;
+ struct scatterlist *sg = scsi_sglist(srb);
u8 ins, slow_read;
u32 addr;
u16 len;
@@ -631,7 +632,7 @@ int spi_read_flash(struct scsi_cmnd *srb, struct rtsx_chip *chip)
return STATUS_FAIL;
}
- rtsx_stor_access_xfer_buf(buf, pagelen, srb, &index, &offset,
+ rtsx_stor_access_xfer_buf(buf, pagelen, srb, &sg, &offset,
TO_XFER_BUF);
addr += pagelen;
@@ -651,7 +652,8 @@ int spi_write_flash(struct scsi_cmnd *srb, struct rtsx_chip *chip)
u32 addr;
u16 len;
u8 *buf;
- unsigned int index = 0, offset = 0;
+ unsigned int offset = 0;
+ struct scatterlist *sg = scsi_sglist(srb);
spi_set_err_code(chip, SPI_NO_ERR);
@@ -679,7 +681,7 @@ int spi_write_flash(struct scsi_cmnd *srb, struct rtsx_chip *chip)
return STATUS_FAIL;
}
- rtsx_stor_access_xfer_buf(buf, 1, srb, &index, &offset,
+ rtsx_stor_access_xfer_buf(buf, 1, srb, &sg, &offset,
FROM_XFER_BUF);
rtsx_init_cmd(chip);
@@ -722,7 +724,7 @@ int spi_write_flash(struct scsi_cmnd *srb, struct rtsx_chip *chip)
return STATUS_ERROR;
while (len) {
- rtsx_stor_access_xfer_buf(buf, 1, srb, &index, &offset,
+ rtsx_stor_access_xfer_buf(buf, 1, srb, &sg, &offset,
FROM_XFER_BUF);
rtsx_init_cmd(chip);
@@ -788,7 +790,7 @@ int spi_write_flash(struct scsi_cmnd *srb, struct rtsx_chip *chip)
rtsx_send_cmd_no_wait(chip);
- rtsx_stor_access_xfer_buf(buf, pagelen, srb, &index,
+ rtsx_stor_access_xfer_buf(buf, pagelen, srb, &sg,
&offset, FROM_XFER_BUF);
retval = rtsx_transfer_data(chip, 0, buf, pagelen, 0,
Use the scatterlist iterators and remove direct indexing of the scatterlist array. This way allows us to pre-allocate one small scatterlist, which can be chained with one runtime allocated scatterlist if the pre-allocated one isn't enough for the whole request. Cc: Kim Bradley <kim.jamie.bradley@gmail.com> Cc: devel@driverdev.osuosl.org Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Signed-off-by: Ming Lei <ming.lei@redhat.com> --- drivers/staging/rts5208/rtsx_transport.c | 32 +++++++++++------------- drivers/staging/rts5208/rtsx_transport.h | 2 +- drivers/staging/rts5208/spi.c | 14 ++++++----- 3 files changed, 24 insertions(+), 24 deletions(-)