亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? usr_blk_dev.c

?? 包含MMC協議,驅動源碼. 在LINUX操作系統下通過.
?? C
?? 第 1 頁 / 共 5 頁
字號:
    {        info_p->media_state = USR_BLK_DEV_MEDIA_STATE_INITIALIZED;    }    tracemsg("changed: %d\n", changed);    usr_blk_dev_cmd_data_processed(info_p, USR_BLK_DEV_CMD_SRC_GEN);    return changed;}/*! * @brief Handles revalidation of the device. * * The file system/kernel will call this function when a part change is detected * (this includes the initial part detection).   It will clear out the * partition information and re-initialize it by calling register_disk(). Once * register_disk() returns the partition information will be set up.  It should * be noted, that the devices partition table will be read through the request * queue before register disk returns.  Thus, calls to this function cannot * lock up any resources used by the request queue mechanism or the partition * table will not be read and the device will lock up. * * @param i_rdev Kernel device information * * @return Always returns 0. */static int usr_blk_dev_revalidate(kdev_t i_rdev){    USR_BLK_DEV_INFO_T *info_p;    unsigned int dev_num;    unsigned int i;    tracemsg("\n");    dev_num = USR_BLK_DEV_DEVICE_NR(i_rdev);    info_p = &usr_blk_dev_info[dev_num];    if (info_p->params.device_size != 0)    {        /* Send the revalidate command to user space. */        usr_blk_dev_send_cmd_to_thread_and_wait(info_p, USR_BLK_DEV_CMD_ID_REVALIDATE,                                                dev_num, USR_BLK_DEV_CMD_SRC_GEN);        usr_blk_dev_cmd_data_processed(info_p, USR_BLK_DEV_CMD_SRC_GEN);        if (info_p->media_state != USR_BLK_DEV_MEDIA_STATE_ERROR)        {            i = dev_num<<USR_BLK_DEV_SHIFT;            /*             * Reset the sizes and partition data based on the data which was received from             * device during the initialization sequence.             */            while (i < (dev_num+1)<<USR_BLK_DEV_SHIFT)            {                memset(&usr_blk_dev_partitions[i], 0, sizeof(usr_blk_dev_partitions[0]));                usr_blk_dev_sizes[i] = 0;                usr_blk_dev_max_sectors[i] = USR_BLK_DEV_MAX_SECTORS_PER_REQ;                usr_blk_dev_blksizes[i] = info_p->params.read_block_len;                usr_blk_dev_gendisk.part[i].nr_sects = 0;                i++;            }            /* Get the partition data from the device which is attached. */            register_disk(&usr_blk_dev_gendisk,                          i_rdev,                          dev_num<<USR_BLK_DEV_SHIFT,                          (struct block_device_operations *)&usr_blk_dev_ops,                          info_p->params.device_size);            info_p->media_state = USR_BLK_DEV_MEDIA_STATE_VALIDATED;            tracemsg("Disk registered\n");            for (i=dev_num<<USR_BLK_DEV_SHIFT; i<(dev_num+1)<<USR_BLK_DEV_SHIFT; i++)            {                tracemsg("%02d: nr_sects: %010ld start_sect: %010ld blk_size: %08d part_size: %08d\n", i,                         usr_blk_dev_gendisk.part[i].nr_sects,                         usr_blk_dev_gendisk.part[i].start_sect,                         usr_blk_dev_blksizes[i],                         usr_blk_dev_sizes[i]);            }        }        else        {            printk(KERN_ERR "usr_blk_dev: Media error encountered while attempting to revalidate device %d.\n", dev_num);        }    }    else    {        printk(KERN_WARNING "usr_blk_dev: Attempt to revalidate an uninitialized device %d.\n", dev_num);    }    return 0;}/*! * @brief Handles the i/o control calls for the device. * * Handles the following ioctl requests:<BR> *   BLKRRPART   - Reread the partition table.<BR> *   HDIO_GETGEO - Return the disk geometry.  In this case the number of *                 cylinders is set to the number if sectors on the disk and *                 the start value of the geometry is set to the start sector. *                 See struct hd_geometry in the kernel for more information.<BR> *   General     - Many other requests are handled by the the general purpose *                 block device ioctl handler blk_ioctl(). * * @param inode_p A pointer to the files inode. * @param file_p  Pointer to the file structure for the operation. * @param cmd     The IOCTL command to operate on. * @param arg     The argument information for cmd. * * @return General:<BR> *            -EFAULT upon a copy to or from user problem.<BR> *            -EACCES upon an user access problem.<BR> *            -ENOTTY if an unsupported request is made.<BR> *         BLKRRPART:<BR> *             Returns 0 upon success.<BR> *         HDIO_GETGEO:<BR> *             Returns 0 upon success. *              */static int usr_blk_dev_ioctl(struct inode *inode_p, struct file *file_p,                             unsigned int cmd, unsigned long arg){    int minor;    int dev_num;    int ret_val;    long ret;    long tmp;    USR_BLK_DEV_INFO_T *info_p;    struct hd_geometry geometry;    tracemsg("cmd: %08x\n", cmd);    minor = MINOR(inode_p->i_rdev);    dev_num = USR_BLK_DEV_DEVICE_NR(inode_p->i_rdev);    info_p = &usr_blk_dev_info[dev_num];    switch (cmd)    {        case BLKRRPART:            if (!capable(CAP_SYS_ADMIN))            {                return -EACCES;            }            return usr_blk_dev_revalidate(inode_p->i_rdev);                    case HDIO_GETGEO:            geometry.cylinders = usr_blk_dev_partitions[minor].nr_sects;            geometry.heads = 1;            geometry.sectors = 1;            geometry.start = usr_blk_dev_partitions[minor].start_sect;            if (copy_to_user((void *)arg, &geometry, sizeof(geometry)))            {                return -EFAULT;            }            tracemsg("geometry.cylinders: %d geometry.start: %ld\n", geometry.cylinders, geometry.start);            return 0;        case _IOR('I', 0x0f05, int):  /* Temporary support for old MMC defines. */        case IOCMMCGETCARDSTATUS:            /*             * The existing MMC driver returns the following statuses:             *   0x01 - Card is write protected             *   0x02 - Card is locked             *   0x04 - Attempt at a the last lock failed               *   0x08 - Locking not supported             *             * The following is new to this driver:             *   0x10 - Card has changed since the last call.  To clear this bit, it must be set before             *          ioctl is called (see comment below).             */            if (get_user(tmp, (unsigned long *)arg))            {                return -EFAULT;            }            ret = IOCMMC_STATUS_LOCK_NOT_SUPPORTED;            ret |= (info_p->ioctl_media_changed ? IOCMMC_STATUS_MEDIA_CHANGED : 0);            /* Clear the bit if it was requested. */            if (tmp & IOCMMC_STATUS_MEDIA_CHANGED)            {                info_p->ioctl_media_changed = false;            }            return put_user(ret, (unsigned long *)arg);                    case _IOR('I', 0x0f06, int):  /* Temporary support for old MMC defines. */        case IOCMMCGETCARDTYPE:            /*             * Return the card type as follows (this is the same as the MMC driver):             *  0 - MMC Card             *  1 - SD Card             */            /* TODO - Needs to be updated to get the information from the user driver. */            return put_user((unsigned long)IOCMMC_TYPE_SD, (unsigned long *)arg);        case _IOR('I', 0x0f09, int):  /* Temporary support for old MMC defines. */        case IOCMMCGETSIZE:            /*             * Returns the size in bytes as opposed to block as is done by BLKGETSIZE.             */            return put_user(usr_blk_dev_partitions[minor].nr_sects*usr_blk_dev_blksizes[minor], (unsigned long *)arg);        case _IOR('I', 0x0f02, int):   /* Temporary support for old MMC defines. */        case IOCMMCGETCARDCID:            /*             * Returns the 16 byte CID register as read in the user space driver.  For devices             * which do not have a CID an array of 16 0's will be returned.             */            memset(info_p->cmd[USR_BLK_DEV_CMD_SRC_GEN].data.cmd_data_from_usr.cid,                   0, sizeof(info_p->cmd[USR_BLK_DEV_CMD_SRC_GEN].data.cmd_data_from_usr.cid));            usr_blk_dev_send_cmd_to_thread_and_wait(info_p, USR_BLK_DEV_CMD_ID_READ_CID,                                                    dev_num, USR_BLK_DEV_CMD_SRC_GEN);            ret_val = copy_to_user((void *)arg,                                   info_p->cmd[USR_BLK_DEV_CMD_SRC_GEN].data.cmd_data_from_usr.cid,                                   sizeof(info_p->cmd[USR_BLK_DEV_CMD_SRC_GEN].data.cmd_data_from_usr.cid));            usr_blk_dev_cmd_data_processed(info_p, USR_BLK_DEV_CMD_SRC_GEN);            if (info_p->media_state != USR_BLK_DEV_MEDIA_STATE_ERROR)            {                return -EIO;            }            if (ret_val)            {                return -EFAULT;            }            return 0;                    default:            return blk_ioctl(inode_p->i_rdev, cmd, arg);    }    return -ENOTTY;}/*! * @brief Handle media requests for the block device. * * Handles media requests which are sent to the driver via the request queue. * Two different types of requests can be sent, they are for reads and writes * to the device.  In general this driver is set up to allow multiple request * queues, one per physical device attached.  All of these queues go through * this handler function.  Since multiple queues are supported none of the * general purpose handlers in blk.h can be used. * * This handler is called by the kernel when it needs to read or write data * to the device.  This may or may not be in a user context.  As a result * it cannot block under any circumstances.  This is accomplished by sending * the request to the user block thread for handling.  Once the thread receives * a read or write command the queue is operated on by the function * usr_blk_dev_thread_rw_cmd() which will loop until all requests have been * removed from the queue. * * If a request is received while the user block thread is currently acting * on a read or write command, nothing is done.  The transfer will be * handled by the user block thread. * * @param req_queue_p Pointer to the head node on the request queue. */static void usr_blk_dev_request(request_queue_t *req_queue_p){    USR_BLK_DEV_INFO_T *info_p;    struct request *req_p;    unsigned int dev_num;    tracemsg("\n");    req_p = blkdev_entry_next_request(&req_queue_p->queue_head);    if (req_p == NULL)    {        tracemsg("Error: request pointer is NULL.\n");        return;    }    dev_num = USR_BLK_DEV_DEVICE_NR(req_p->rq_dev);    info_p = &usr_blk_dev_info[dev_num];    tracemsg("Request for device %d state: %d\n", dev_num, (int)info_p->cmd[USR_BLK_DEV_CMD_SRC_REQ].state);    if (info_p->media_state <= USR_BLK_DEV_MEDIA_STATE_ERROR)    {        tracemsg("Error: Request made while device not attached.\n");    }    if ((info_p->cmd[USR_BLK_DEV_CMD_SRC_REQ].state == USR_BLK_DEV_CMD_STATE_NONE) &&        (!list_empty(&req_queue_p->queue_head)))    {        /*         * At this point a valid request can be sent to the user mode driver.  Since         * this function cannot block, the usr block dev thread is used to send the         * command and complete the request.         */        usr_blk_dev_send_cmd_to_thread((req_p->cmd == WRITE) ? USR_BLK_DEV_CMD_ID_WRITE : USR_BLK_DEV_CMD_ID_READ,                                       dev_num,                                       USR_BLK_DEV_CMD_SRC_REQ);    }}/*! * @brief Returns a pointer to the request queue for the device. * * @param dev Kernel device information * * @return A pointer to the request queue for the device */request_queue_t *usr_blk_dev_find_req_queue(kdev_t dev){    unsigned int dev_num;    static int count = 0;    dev_num = USR_BLK_DEV_DEVICE_NR(dev);    if (dev_num >= USR_BLK_DEV_NUM_DEVICES)    {        if (count < 5)        {            count++;            printk(KERN_WARNING "usr_blk_dev: Request for unknown device: %d", dev_num);        }        return NULL;    }    return &usr_blk_dev_info[dev_num].req_queue;}/*! * @brief Defines the file operations supported by the user space block *        driver device.  */static const struct block_device_operations usr_blk_dev_ops ={    .check_media_change = usr_blk_dev_check_media_change,    .ioctl              = usr_blk_dev_ioctl,    .open               = usr_blk_dev_open,    .release            = usr_blk_dev_release,    .revalidate         = usr_blk_dev_revalidate};/*! * @brief Defines the files operations supported by the proc entry *        used for communication with user space. */static const struct file_operations usr_blk_dev_proc_ops ={    .open =    usr_blk_dev_proc_open,    .poll =    usr_blk_dev_proc_poll,    .read =    usr_blk_dev_proc_read,    .release = usr_blk_dev_proc_release,    .write =   usr_blk_dev_proc_write};/*! * @brief Handles the init command from within the user block device thread. * * Handles the init command from the user block thread.  This will pass the init * command on to user space and wait for a response.  Once the response is * received the necessary data will be copied into the devices information * structure and hotplug will be called. * * @param info_p  Pointer to the devices information structure * @param dev_num The device number (not the minor number) */static void usr_blk_dev_thread_init_cmd(

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲综合视频在线| 欧美无乱码久久久免费午夜一区 | 日本va欧美va精品发布| 久久精品国产精品亚洲综合| 丁香亚洲综合激情啪啪综合| 欧美日韩黄色一区二区| 欧美国产精品v| 久久er99热精品一区二区| 91精彩视频在线| 亚洲欧洲精品一区二区三区不卡| 奇米亚洲午夜久久精品| 91福利精品视频| 中文子幕无线码一区tr| 国产一区二区三区最好精华液| 欧美视频精品在线观看| 亚洲精品久久久蜜桃| 成人永久免费视频| 国产视频亚洲色图| 九一九一国产精品| 日韩美女在线视频| 久久精品国产**网站演员| 欧美手机在线视频| 亚洲一区成人在线| 欧美性感一区二区三区| 亚洲欧美一区二区久久| 国产一区二区不卡| 欧美精品一区二区三区在线| 美女视频网站黄色亚洲| 91精品国产aⅴ一区二区| 亚洲高清三级视频| 欧美网站一区二区| 天堂资源在线中文精品| 欧美亚洲一区二区在线| 亚洲图片欧美色图| 欧美吞精做爰啪啪高潮| 亚洲成人在线观看视频| 欧美精品亚洲二区| 日韩不卡一区二区三区| 欧美成人性福生活免费看| 美女脱光内衣内裤视频久久影院| 日韩三级在线观看| 麻豆久久久久久久| 精品免费视频.| 国产伦理精品不卡| 国产精品欧美一区喷水| av电影天堂一区二区在线| 成人欧美一区二区三区黑人麻豆| av电影在线观看完整版一区二区| 亚洲视频 欧洲视频| 在线观看一区二区精品视频| 天天综合色天天| 亚洲精品在线网站| 99久久夜色精品国产网站| 亚洲一区在线观看免费| 欧美一级日韩不卡播放免费| 激情综合网最新| 国产精品久久久久永久免费观看| 91免费看`日韩一区二区| 五月激情丁香一区二区三区| 精品国产乱码久久久久久影片| 国产·精品毛片| 亚洲猫色日本管| 欧美一区二区三区免费在线看| 狠狠网亚洲精品| 一区二区三区中文字幕| 69精品人人人人| 99久久免费精品高清特色大片| 亚洲成av人片在线观看| 精品国产乱码91久久久久久网站| www.亚洲免费av| 午夜电影久久久| 国产欧美日韩另类一区| 欧美性受极品xxxx喷水| 精品亚洲porn| 亚洲国产日韩a在线播放性色| 精品国产乱码久久久久久久| 色哟哟一区二区在线观看| 久久99精品一区二区三区 | 精品国产一区二区在线观看| 91亚洲男人天堂| 国产自产视频一区二区三区| 五月天激情小说综合| 日韩理论在线观看| 久久婷婷国产综合国色天香 | 豆国产96在线|亚洲| 亚洲一二三区在线观看| 欧美国产精品久久| 欧美变态tickling挠脚心| 欧美艳星brazzers| 99国产精品久久久久| 经典三级一区二区| 日韩avvvv在线播放| 亚洲精品国产第一综合99久久 | 欧美亚洲愉拍一区二区| 暴力调教一区二区三区| 韩国av一区二区三区四区| 丝瓜av网站精品一区二区| 亚洲欧美日韩电影| 中文字幕中文字幕一区二区| 精品久久久久久久久久久久久久久久久 | 欧美韩国一区二区| 九九热在线视频观看这里只有精品| 亚洲人亚洲人成电影网站色| 精品剧情v国产在线观看在线| 欧美日韩五月天| 色婷婷久久久久swag精品| 成人va在线观看| 国产福利电影一区二区三区| 美女免费视频一区二区| 久久国产精品一区二区| 亚洲精品精品亚洲| 日本精品一级二级| 99re在线精品| 韩国精品久久久| 99在线精品一区二区三区| 免费成人av资源网| 伊人夜夜躁av伊人久久| 国产欧美一区二区三区在线老狼 | 91丨porny丨国产| 国产精品麻豆视频| 国产欧美日产一区| 中文字幕av资源一区| 欧美高清在线精品一区| 欧美国产禁国产网站cc| 国产精品超碰97尤物18| **性色生活片久久毛片| 亚洲六月丁香色婷婷综合久久 | av中文一区二区三区| 99re这里只有精品视频首页| 91麻豆.com| 欧美性视频一区二区三区| 欧美群妇大交群的观看方式| 欧美一区二区三区白人| 欧美精品一区二区在线观看| 中文字幕电影一区| 一区二区三区四区不卡在线| 视频在线观看国产精品| 久久精品久久99精品久久| 国产成人午夜视频| 91猫先生在线| 欧美精品亚洲二区| 久久精品欧美一区二区三区麻豆| 国产精品私房写真福利视频| 亚洲色图丝袜美腿| 奇米精品一区二区三区在线观看| 国产一区二区三区免费在线观看| 成人综合婷婷国产精品久久蜜臀| 色诱视频网站一区| 精品久久久久久久人人人人传媒| 中文文精品字幕一区二区| 亚洲一区二区三区中文字幕在线| 蜜桃久久久久久久| 91看片淫黄大片一级| 欧美成人官网二区| 亚洲乱码国产乱码精品精可以看| 经典一区二区三区| 在线精品国精品国产尤物884a| 精品区一区二区| 亚洲一区二区三区中文字幕在线| 久草在线在线精品观看| 在线精品视频免费播放| 2023国产精品自拍| 亚洲风情在线资源站| 99re这里只有精品首页| 欧美成人三级在线| 亚洲国产一区二区三区| 成人小视频在线观看| 日韩精品一区国产麻豆| 亚洲综合免费观看高清在线观看| 国产在线一区观看| 欧美日韩一区二区三区在线看| 久久婷婷久久一区二区三区| 亚洲午夜一区二区| 99久久99久久精品国产片果冻| 91精品国产日韩91久久久久久| 中文字幕日韩欧美一区二区三区| 毛片av中文字幕一区二区| 一本久道久久综合中文字幕| 日本一区二区三区视频视频| 久久99精品一区二区三区三区| 欧美日韩精品一区视频| 亚洲乱码国产乱码精品精的特点 | 在线观看成人免费视频| 国产亚洲va综合人人澡精品| 久久精品国产秦先生| 欧美一区二区三区在线看| 亚洲一级片在线观看| 91在线看国产| 中文成人av在线| 丁香网亚洲国际| 国产亚洲欧美日韩在线一区| 精品一区二区三区在线播放视频 | 激情六月婷婷久久| 制服丝袜在线91| 亚洲国产裸拍裸体视频在线观看乱了| 91丨九色porny丨蝌蚪| 国产精品成人午夜| av午夜一区麻豆| 亚洲图片欧美激情| 91看片淫黄大片一级在线观看|