Rev 4428 | Rev 4442 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 4428 | Rev 4440 | ||
|---|---|---|---|
| Line 70... | Line 70... | ||
| 70 | uint32_t control; |
70 | uint32_t control; |
| 71 | uint32_t pad3[3]; |
71 | uint32_t pad3[3]; |
| 72 | 72 | ||
| 73 | uint32_t status; |
73 | uint32_t status; |
| 74 | 74 | ||
| 75 | /* FIXME: Need to fix pio_enable() to support >= page_size areas. |
- | |
| 76 | - | ||
| 77 | uint32_t pad4[3]; |
75 | uint32_t pad4[3]; |
| 78 | uint32_t pad5[0x3fc0]; |
76 | uint8_t pad5[0x3fc0]; |
| 79 | 77 | ||
| 80 | uint8_t buffer[512];*/ |
78 | uint8_t buffer[512]; |
| 81 | } gxe_bd_t; |
79 | } gxe_bd_t; |
| 82 | 80 | ||
| 83 | typedef struct { |
- | |
| 84 | uint8_t buffer[512]; |
- | |
| 85 | } gxe_buf_t; |
- | |
| 86 | 81 | ||
| 87 | static const size_t block_size = 512; |
82 | static const size_t block_size = 512; |
| 88 | static size_t comm_size; |
83 | static size_t comm_size; |
| 89 | 84 | ||
| 90 | static uintptr_t dev_physical = 0x13000000; |
85 | static uintptr_t dev_physical = 0x13000000; |
| 91 | static gxe_bd_t *dev; |
86 | static gxe_bd_t *dev; |
| 92 | static gxe_buf_t *devbuf; |
- | |
| 93 | 87 | ||
| 94 | static uint32_t disk_id = 0; |
88 | static uint32_t disk_id = 0; |
| 95 | 89 | ||
| 96 | static atomic_t dev_futex = FUTEX_INITIALIZER; |
90 | static atomic_t dev_futex = FUTEX_INITIALIZER; |
| 97 | 91 | ||
| Line 133... | Line 127... | ||
| 133 | return rc; |
127 | return rc; |
| 134 | } |
128 | } |
| 135 | 129 | ||
| 136 | dev = vaddr; |
130 | dev = vaddr; |
| 137 | 131 | ||
| 138 | rc = pio_enable((void *) dev_physical + 0x4000, sizeof(gxe_buf_t), &vaddr); |
- | |
| 139 | if (rc != EOK) { |
- | |
| 140 | printf(NAME ": Could not initialize device I/O space.\n"); |
- | |
| 141 | return rc; |
- | |
| 142 | } |
- | |
| 143 | - | ||
| 144 | devbuf = vaddr; |
- | |
| 145 | - | ||
| 146 | rc = devmap_device_register("disk0", &dev_handle); |
132 | rc = devmap_device_register("disk0", &dev_handle); |
| 147 | if (rc != EOK) { |
133 | if (rc != EOK) { |
| 148 | devmap_hangup_phone(DEVMAP_DRIVER); |
134 | devmap_hangup_phone(DEVMAP_DRIVER); |
| 149 | printf(NAME ": Unable to register device.\n"); |
135 | printf(NAME ": Unable to register device.\n"); |
| 150 | return rc; |
136 | return rc; |
| Line 250... | Line 236... | ||
| 250 | if (status == STATUS_FAILURE) { |
236 | if (status == STATUS_FAILURE) { |
| 251 | return EIO; |
237 | return EIO; |
| 252 | } |
238 | } |
| 253 | 239 | ||
| 254 | for (i = 0; i < size; i++) { |
240 | for (i = 0; i < size; i++) { |
| 255 | ((uint8_t *) buf)[i] = w = |
- | |
| 256 | pio_read_8(&devbuf->buffer[i]); |
241 | ((uint8_t *) buf)[i] = w = pio_read_8(&dev->buffer[i]); |
| 257 | } |
242 | } |
| 258 | 243 | ||
| 259 | futex_up(&dev_futex); |
244 | futex_up(&dev_futex); |
| 260 | return EOK; |
245 | return EOK; |
| 261 | } |
246 | } |
| Line 265... | Line 250... | ||
| 265 | uint32_t status; |
250 | uint32_t status; |
| 266 | size_t i; |
251 | size_t i; |
| 267 | uint32_t w; |
252 | uint32_t w; |
| 268 | 253 | ||
| 269 | for (i = 0; i < size; i++) { |
254 | for (i = 0; i < size; i++) { |
| 270 | pio_write_8(&devbuf->buffer[i], ((const uint8_t *) buf)[i]); |
255 | pio_write_8(&dev->buffer[i], ((const uint8_t *) buf)[i]); |
| 271 | } |
256 | } |
| 272 | 257 | ||
| 273 | futex_down(&dev_futex); |
258 | futex_down(&dev_futex); |
| 274 | pio_write_32(&dev->offset_lo, (uint32_t) offset); |
259 | pio_write_32(&dev->offset_lo, (uint32_t) offset); |
| 275 | pio_write_32(&dev->offset_hi, offset >> 32); |
260 | pio_write_32(&dev->offset_hi, offset >> 32); |