Fork us on GitHub Follow us on Facebook Follow us on Twitter

Changeset 84adbf0 in mainline


Ignore:
Timestamp:
2009-05-29T03:19:29Z (14 years ago)
Author:
Jiri Svoboda <jirik.svoboda@…>
Branches:
lfn, master, serial
Children:
4bda76b
Parents:
6b2f4c1
Message:

Support more than one disk in gxe_bd (hardcoded to 2).

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/bd/gxe_bd/gxe_bd.c

    r6b2f4c1 r84adbf0  
    5959};
    6060
     61enum {
     62        MAX_DISKS       = 2
     63};
     64
    6165typedef struct {
    6266        uint32_t offset_lo;
     
    8690static gxe_bd_t *dev;
    8791
    88 static uint32_t disk_id = 0;
     92static dev_handle_t dev_handle[MAX_DISKS];
    8993
    9094static atomic_t dev_futex = FUTEX_INITIALIZER;
     
    9296static int gxe_bd_init(void);
    9397static void gxe_bd_connection(ipc_callid_t iid, ipc_call_t *icall);
    94 static int gx_bd_rdwr(ipcarg_t method, off_t offset, off_t size, void *buf);
    95 static int gxe_bd_read_block(uint64_t offset, size_t size, void *buf);
    96 static int gxe_bd_write_block(uint64_t offset, size_t size, const void *buf);
     98static int gx_bd_rdwr(int disk_id, ipcarg_t method, off_t offset, off_t size,
     99    void *buf);
     100static int gxe_bd_read_block(int disk_id, uint64_t offset, size_t size,
     101    void *buf);
     102static int gxe_bd_write_block(int disk_id, uint64_t offset, size_t size,
     103    const void *buf);
    97104
    98105int main(int argc, char **argv)
     
    112119static int gxe_bd_init(void)
    113120{
    114         dev_handle_t dev_handle;
    115121        void *vaddr;
    116         int rc;
     122        int rc, i;
     123        char name[16];
    117124
    118125        rc = devmap_driver_register(NAME, gxe_bd_connection);
     
    130137        dev = vaddr;
    131138
    132         rc = devmap_device_register("disk0", &dev_handle);
    133         if (rc != EOK) {
    134                 devmap_hangup_phone(DEVMAP_DRIVER);
    135                 printf(NAME ": Unable to register device.\n");
    136                 return rc;
     139        for (i = 0; i < MAX_DISKS; i++) {
     140                snprintf(name, 16, "disk%d", i);
     141                rc = devmap_device_register(name, &dev_handle[i]);
     142                if (rc != EOK) {
     143                        devmap_hangup_phone(DEVMAP_DRIVER);
     144                        printf(NAME ": Unable to register device %s.\n",
     145                                name);
     146                        return rc;
     147                }
    137148        }
    138149
     
    146157        ipc_call_t call;
    147158        ipcarg_t method;
     159        dev_handle_t dh;
    148160        int flags;
    149161        int retval;
    150162        off_t idx;
    151163        off_t size;
     164        int disk_id, i;
     165
     166        /* Get the device handle. */
     167        dh = IPC_GET_ARG1(*icall);
     168
     169        /* Determine which disk device is the client connecting to. */
     170        disk_id = -1;
     171        for (i = 0; i < MAX_DISKS; i++)
     172                if (dev_handle[i] == dh)
     173                        disk_id = i;
     174
     175        if (disk_id < 0) {
     176                ipc_answer_0(iid, EINVAL);
     177                return;
     178        }
    152179
    153180        /* Answer the IPC_M_CONNECT_ME_TO call. */
     
    183210                                break;
    184211                        }
    185                         retval = gx_bd_rdwr(method, idx * size, size, fs_va);
     212                        retval = gx_bd_rdwr(disk_id, method, idx * size,
     213                            size, fs_va);
    186214                        break;
    187215                default:
     
    193221}
    194222
    195 static int gx_bd_rdwr(ipcarg_t method, off_t offset, off_t size, void *buf)
     223static int gx_bd_rdwr(int disk_id, ipcarg_t method, off_t offset, off_t size,
     224    void *buf)
    196225{
    197226        int rc;
     
    202231
    203232                if (method == BD_READ_BLOCK)
    204                         rc = gxe_bd_read_block(offset, now, buf);
     233                        rc = gxe_bd_read_block(disk_id, offset, now, buf);
    205234                else
    206                         rc = gxe_bd_write_block(offset, now, buf);
     235                        rc = gxe_bd_write_block(disk_id, offset, now, buf);
    207236
    208237                if (rc != EOK)
     
    221250}
    222251
    223 static int gxe_bd_read_block(uint64_t offset, size_t size, void *buf)
     252static int gxe_bd_read_block(int disk_id, uint64_t offset, size_t size,
     253    void *buf)
    224254{
    225255        uint32_t status;
     
    246276}
    247277
    248 static int gxe_bd_write_block(uint64_t offset, size_t size, const void *buf)
     278static int gxe_bd_write_block(int disk_id, uint64_t offset, size_t size,
     279    const void *buf)
    249280{
    250281        uint32_t status;
    251282        size_t i;
    252         uint32_t w;
    253283
    254284        for (i = 0; i < size; i++) {
Note: See TracChangeset for help on using the changeset viewer.