/**
* @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;
}
Example #2
0
/**
* @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;
}