/** * @brief Scatter list data transfer function. * @param sd[in]: Card information. * @param sector[in]: Start sector. * @param sg[in]: Scatter list pointer. * @param ln[in]: List number. * @return Actual sectors by reading/ERROR_ID(<0). */ static int gp_sdcard_transfer_scatter(gpSDInfo_t *sd, unsigned long sector, struct scatterlist *sg, unsigned int ln, int write) { int ret; int pin_handle; /* ----- Check card status ----- */ if((gp_sdcard_ckinsert(sd)==0)||(sd->handle_dma==0)) return -ENXIO; /* ----- Get pin handle ----- */ pin_handle = gp_board_pin_func_request((sd->device_id==0)?GP_PIN_SD0:GP_PIN_SD1, GP_BOARD_WAIT_FOREVER); if(pin_handle<0) { DERROR("SD%d: can't get pin handle\n", sd->device_id); return -EIO; } if(write==0) { ret = gp_sdcard_read_scatter(sd, sector, sg, ln); } else { /* ----- Check write protect ----- */ if(sd->sd_func->is_write_protected()==1) ret = -EROFS; else ret = gp_sdcard_write_scatter(sd, sector, sg, ln); } gp_board_pin_func_release(pin_handle); return ret; }
/** * @brief Scatter list data transfer function. * @param sd[in]: Card information. * @param sector[in]: Start sector. * @param sg[in]: Scatter list pointer. * @param ln[in]: List number. * @return Actual sectors by reading/ERROR_ID(<0). */ static int gp_sdcard_transfer_scatter(gpSDInfo_t *sd, unsigned long sector, struct scatterlist *sg, unsigned int ln, int write) { int ret; int pin_handle; int pin_id; /* ----- Check card status ----- */ if(gp_sdcard_ckinsert(sd)==0) { sd->fremove = 1; return -ENXIO; } #ifdef PIN_REQUEST_FUNCTION if(sd->device_id == 0) pin_id = GP_PIN_SD0; else if(sd->device_id == 1) pin_id = GP_PIN_SD1; else pin_id = GP_PIN_SD2; /* ----- Get pin handle ----- */ pin_handle = gp_board_pin_func_request( pin_id, GP_BOARD_WAIT_FOREVER); if(pin_handle<0) { DERROR("[%d]: can't get pin handle\n", sd->device_id); return -EBUSY; } #endif if(write==0) { ret = gp_sdcard_read_scatter(sd, sector, sg, ln); } else { /* ----- Check write protect ----- */ if(sd->sd_func->is_write_protected()==1) ret = -EROFS; else ret = gp_sdcard_write_scatter(sd, sector, sg, ln); } #ifdef PIN_REQUEST_FUNCTION gp_board_pin_func_release(pin_handle); #endif return ret; }