Changes in uspace/drv/block/isa-ide/main.c [443695e:2a5d4649] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/block/isa-ide/main.c
r443695e r2a5d4649 1 1 /* 2 * Copyright (c) 202 4Jiri Svoboda2 * Copyright (c) 2025 Jiri Svoboda 3 3 * All rights reserved. 4 4 * … … 43 43 44 44 #include "isa-ide.h" 45 #include "isa-ide_hw.h" 45 46 #include "main.h" 46 47 … … 48 49 static errno_t isa_ide_dev_remove(ddf_dev_t *dev); 49 50 static errno_t isa_ide_dev_gone(ddf_dev_t *dev); 51 static errno_t isa_ide_dev_quiesce(ddf_dev_t *dev); 50 52 static errno_t isa_ide_fun_online(ddf_fun_t *fun); 51 53 static errno_t isa_ide_fun_offline(ddf_fun_t *fun); … … 54 56 55 57 static driver_ops_t driver_ops = { 56 .dev_add = &isa_ide_dev_add, 57 .dev_remove = &isa_ide_dev_remove, 58 .dev_gone = &isa_ide_dev_gone, 59 .fun_online = &isa_ide_fun_online, 60 .fun_offline = &isa_ide_fun_offline 58 .dev_add = isa_ide_dev_add, 59 .dev_remove = isa_ide_dev_remove, 60 .dev_gone = isa_ide_dev_gone, 61 .dev_quiesce = isa_ide_dev_quiesce, 62 .fun_online = isa_ide_fun_online, 63 .fun_offline = isa_ide_fun_offline 61 64 }; 62 65 … … 70 73 async_sess_t *parent_sess; 71 74 hw_res_list_parsed_t hw_res; 72 hw_res_ flags_t flags;75 hw_res_claims_t claims; 73 76 errno_t rc; 74 77 … … 77 80 return ENOMEM; 78 81 79 rc = hw_res_get_flags(parent_sess, &flags); 80 if (rc != EOK) 81 return rc; 82 83 /* 84 * Prevent attaching to the legacy ISA IDE register block 85 * on a system with PCI not to conflict with PCI IDE. 86 * 87 * XXX This is a simplification. If we had a PCI-based system without 88 * PCI-IDE or with PCI-IDE disabled and would still like to use 89 * an ISA IDE controller, this would prevent us from doing so. 90 */ 91 if (flags & hwf_isa_bridge) { 92 ddf_msg(LVL_NOTE, "Will not attach to PCI/ISA bridge."); 93 return EIO; 82 rc = hw_res_query_legacy_io(parent_sess, &claims); 83 if (rc != EOK) { 84 ddf_msg(LVL_NOTE, "Error getting HW resource flags."); 85 return rc; 94 86 } 95 87 96 88 hw_res_list_parsed_init(&hw_res); 97 89 rc = hw_res_get_list_parsed(parent_sess, &hw_res, 0); 98 if (rc != EOK) 99 return rc; 90 if (rc != EOK) { 91 ddf_msg(LVL_NOTE, "Error getting HW resource list."); 92 return rc; 93 } 100 94 101 95 if (hw_res.io_ranges.count != 4) { … … 148 142 } 149 143 144 /* 145 * Only attach to legacy ISA IDE register block if it 146 * is not claimed by PCI IDE driver. 147 */ 148 if (res->cmd1 == leg_ide_ata_cmd_p && 149 res->cmd2 == leg_ide_ata_cmd_s && 150 (claims & hwc_isa_ide) != 0) { 151 ddf_msg(LVL_NOTE, "Will not attach to ISA legacy ports " 152 "since they are already handled by PCI."); 153 return EBUSY; 154 } 155 150 156 return EOK; 151 157 error: … … 163 169 isa_ide_ctrl_t *ctrl; 164 170 isa_ide_hwres_t res; 171 unsigned chans; 165 172 errno_t rc; 166 173 167 174 rc = isa_ide_get_res(dev, &res); 168 175 if (rc != EOK) { 169 ddf_msg(LVL_ERROR, "Invalid HW resource configuration."); 176 if (rc == EINVAL) 177 ddf_msg(LVL_ERROR, "Invalid HW resource configuration."); 170 178 return EINVAL; 171 179 } … … 180 188 ctrl->dev = dev; 181 189 190 chans = 0; 191 182 192 rc = isa_ide_channel_init(ctrl, &ctrl->channel[0], 0, &res); 183 if (rc == ENOENT) 193 if (rc == EOK) 194 ++chans; 195 else if (rc != ENOENT) 184 196 goto error; 185 197 186 198 rc = isa_ide_channel_init(ctrl, &ctrl->channel[1], 1, &res); 187 if (rc == ENOENT) 188 goto error; 189 190 if (rc != EOK) { 191 ddf_msg(LVL_ERROR, "Failed initializing ATA controller."); 199 if (rc == EOK) 200 ++chans; 201 else if (rc != ENOENT) 202 goto error; 203 204 if (chans == 0) { 205 ddf_msg(LVL_ERROR, "No ISA IDE devices found."); 192 206 rc = EIO; 193 207 goto error; … … 374 388 } 375 389 390 static errno_t isa_ide_dev_quiesce(ddf_dev_t *dev) 391 { 392 isa_ide_ctrl_t *ctrl = (isa_ide_ctrl_t *)ddf_dev_data_get(dev); 393 394 ddf_msg(LVL_DEBUG, "isa_ide_dev_quiesce(%p)", dev); 395 396 isa_ide_channel_quiesce(&ctrl->channel[0]); 397 isa_ide_channel_quiesce(&ctrl->channel[1]); 398 return EOK; 399 } 400 376 401 static errno_t isa_ide_fun_online(ddf_fun_t *fun) 377 402 {
Note:
See TracChangeset
for help on using the changeset viewer.