Пример #1
0
static int card_blk_suspend(struct memory_card *card, pm_message_t state)
{
	struct card_blk_data *card_data = card_get_drvdata(card);
	struct card_host *host = card->host;
	
	if (card_data) 
	{
		card_queue_suspend(&card_data->queue);
	}
	if(!host->sdio_task_state)
	{
		host->sdio_task_state = 1;
	}
	if(!host->card_task_state)
	{
		host->card_task_state = 1;
	}
	if(card->card_suspend)
	{
		card->card_suspend(card);
	}
	if(card->card_type == CARD_SDIO)
		return 0;
		
	card->unit_state = CARD_UNIT_RESUMED;
	return 0;
}
Пример #2
0
static int card_blk_resume(struct memory_card *card)
{
	struct card_blk_data *card_data = card_get_drvdata(card);
	struct card_host *host = card->host;
	
	if(card->card_resume)
	{
		card->card_resume(card);
	}
	if(host->card_task_state)
	{
		host->card_task_state = 0;
		if(host->card_task)
			wake_up_process(host->card_task);
	}
	if((host->sdio_task_state)&&((card->card_type == CARD_SDIO)))
	{
		host->sdio_task_state = 0;
		if(host->sdio_irq_thread)
			wake_up_process(host->sdio_irq_thread);
	}
	if (card_data) {
		//mmc_blk_set_blksize(md, card);
		card_queue_resume(&card_data->queue);
	}
	return 0;
}
Пример #3
0
static int card_blk_resume(struct memory_card *card)
{
	struct card_blk_data *card_data = card_get_drvdata(card);
	struct card_host *host = card->host;
	
	printk("***Entered %s:%s\n", __FILE__,__func__);
	
	printk("Enter %s resume\n",card->name);

	if(card->card_resume)
	{
		card->card_resume(card);
	}
	if(host->card_task_state)
	{
		host->card_task_state = 0;
		if(host->card_task)
			wake_up_process(host->card_task);
	}
	if(host->sdio_task_state)
	{
		host->sdio_task_state = 0;
		if(host->sdio_irq_thread)
			wake_up_process(host->sdio_irq_thread);
	}
	if (card_data) {
		//mmc_blk_set_blksize(md, card);
		card_queue_resume(&card_data->queue);
	}
	return 0;
}
Пример #4
0
static int card_blk_suspend(struct memory_card *card, pm_message_t state)
{
	struct card_blk_data *card_data = card_get_drvdata(card);
	struct card_host *host = card->host;
	
	printk("Enter %s suspend\n",card->name);
	printk("***Entered %s:%s\n", __FILE__,__func__);


	if (card_data) 
	{
		card_queue_suspend(&card_data->queue);
	}
	if(!host->sdio_task_state)
	{
		host->sdio_task_state = 1;
	}
	if(!host->card_task_state)
	{
		host->card_task_state = 1;
	}
	if(card->card_suspend)
	{
		card->card_suspend(card);
	}
	if(card->card_type == CARD_SDIO)
		return 0;
	//card->unit_state = CARD_UNIT_NOT_READY;
	//host->slot_detector = CARD_REMOVED;
	card->unit_state = CARD_UNIT_RESUMED;
	return 0;
}
Пример #5
0
static void card_blk_remove(struct memory_card *card)
{
	struct card_blk_data *card_data = card_get_drvdata(card);

	if (card_data) {
		int devidx;

		del_gendisk(card_data->disk);

		/*
		 * I think this is needed.
		 */
		
		queue_flag_set_unlocked(QUEUE_FLAG_DEAD, card_data->queue.queue);
		queue_flag_set_unlocked(QUEUE_FLAG_STOPPED, card_data->queue.queue);
		card_data->queue.queue->queuedata = NULL;
		card_cleanup_queue(&card_data->queue);
		//card_data->disk->queue = NULL;

		devidx = card_data->disk->first_minor >> CARD_SHIFT;
		__clear_bit(devidx, dev_use);
		card_blk_put(card_data);
	}
	card_set_drvdata(card, NULL);
}
Пример #6
0
void card_remove_inand_lp(struct card_host* host)
{
      struct card_blk_data* card_data=card_get_drvdata(host->card);
      del_gendisk(card_data->disk);
      put_disk(card_data->disk);
      card_remove_card(host->card);
      host->card = NULL;
}
Пример #7
0
static int emmc_key_kernel_rw(struct memory_card *emmccard,struct emmckey_valid_node_t *emmckey_valid_node,u8 *buf,u32 direct)
{
	struct card_blk_data *card_data = card_get_drvdata(emmccard);
	//SD_MMC_Card_Info_t *sd_mmc_info = (SD_MMC_Card_Info_t *)emmccard->card_info;
	struct card_blk_request *brq;
	//struct card_blk_request *brq2;
	struct card_queue *cq;
	struct request_queue *q ;
	struct request *req;
	u32 blk_shift,blk_cnt,blk_count;
	u64 pos;
	int ret;
	//cq = memory_card_to_card_queue(emmccard);
	cq = &card_data->queue;
	q = cq->queue;
	if(cq){
		//printk("%s:%d,cq exist cq:0x%x,cq->bounce_buf:0x%x\n",__func__,__LINE__,(unsigned int)cq,cq->bounce_buf);
		//printk("%s:%d,cq->req:0x%x,cq->queue:0x%x,cq->sg:0x%x,cq->bounce_sg:0x%x,cq->bounce_sg_len:0x%x\n",
		//__func__,__LINE__,cq->req,cq->queue,cq->sg,cq->bounce_sg,cq->bounce_sg_len);
	}
	
	brq = kzalloc(sizeof(*brq), GFP_KERNEL);
	brq->crq.buf = cq->bounce_buf;
	//printk("%s:%d sd_mmc_phy_buf:0x%x, sd_mmc_buf:0x%x\n",__func__,__LINE__,(unsigned int)sd_mmc_info->sd_mmc_phy_buf,(unsigned int)sd_mmc_info->sd_mmc_buf);
	
	//emmccard->card_io_init(emmccard);
	//emmccard->card_detector(emmccard);
	//emmccard->card_insert_process(emmccard);
	//printk("%s:%d,sd_mmc_info->blk_len:%d\n",__func__,__LINE__,1 << card_data->block_bits);

	brq->card_data.sg = cq->sg;
	brq->card_data.sg_len = 1;//card_queue_map_sg(cq);
	//printk("%s:%d,cq->sg:0x%x \n",__func__,__LINE__,(unsigned int)cq->sg);

	ret = card_claim_card_get(emmccard);
	if(ret){
		printk("%s:%d,card_claim_card_get fail,err:%d\n",__func__,__LINE__,ret);
	}
	
	//printk("%s:%d,host->max_blk_size:%d,host->max_blk_count:%d,\n",
	//	__func__,__LINE__,emmccard->host->max_blk_size,emmccard->host->max_blk_count);
	/*note: emmccard->host->max_blk_size is equal (1 << card_data->block_bits)*/
	brq->card_data.blk_size = 1 << card_data->block_bits;
	blk_shift = card_data->block_bits;
	blk_count = emmckey_valid_node->phy_size>>blk_shift;
	pos = 0;
	blk_cnt = 0;
	emmccard->key_protect = 0;
	while(blk_count){
		if(blk_count > emmccard->host->max_blk_count){
			brq->card_data.blk_nums = emmccard->host->max_blk_count;
		}
		else{
			brq->card_data.blk_nums = blk_count;
		}

		brq->card_data.lba = (emmckey_valid_node->phy_addr>>blk_shift) + blk_cnt;
		if(direct){
			brq->crq.cmd = WRITE;
			memcpy(brq->crq.buf,&buf[pos],brq->card_data.blk_size * brq->card_data.blk_nums);
		}
		else{
			brq->crq.cmd = READ;
		}

		emmccard->host->card_type = emmccard->card_type;
		card_wait_for_req(emmccard->host, brq);
		if(brq->card_data.error != 0){
			card_claim_card_put(emmccard->host);
			printk("%s:%d save key data to emmc fail,error:%d\n",__func__,__LINE__,brq->card_data.error);
			goto error;
		}
		if(!direct){//read
			memcpy(&buf[pos],brq->crq.buf,brq->card_data.blk_size * brq->card_data.blk_nums);
		}
		pos += (brq->card_data.blk_size * brq->card_data.blk_nums);
		blk_cnt += brq->card_data.blk_nums ;
		blk_count -= brq->card_data.blk_nums;
	}
	card_claim_card_put(emmccard->host);
error:
	if(brq){
		kfree(brq);
	}
	emmccard->key_protect = 1;
	return brq->card_data.error;
}