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; }
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; }
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; }
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; }
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); }
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; }
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; }