Поимел тут одновременный железо-софтовый апгрейд. И с ходу напоролся на пару серьезных софтовых багов. Разумеется, полез в гугль - ну: ведь не может же это быть только у меня, и вот только сейчас ? Разумеется, не только у меня. Разумеется, pr'ы висят уже года по 2, и не только для какой-то одной системы, а везде, где используется этот код - open source - оно на то и open source, чтобы все примерно одно и то же не писали по многу раз.
Но... Все эти pr (естественно, открытые - то есть, ошибка не исправлена) при гуглевании погребены под толстым слоем выступлений упомянутых троллей - cнисходительных предложений читать документацию, рассуждений о криворукости обнаруживших ошибку, агрессивных рекомендаций сменить "кривое неподдерживаемое железо" и выяснений отношений в стиле "сам дурак".
А между тем, если посмотреть в код, то subj.
Я понимаю, что из заглядывающих в этот журнал c *nix-сами работают 2 или 3 человека, но увековечения, несомненно, стоит.
static int
ata_ati_chipinit(device_t dev)
{
struct ata_pci_controller *ctlr = device_get_softc(dev);
if (ata_setup_interrupt(dev))
return ENXIO;
/* IXP600 & IXP700 only have 1 PATA channel */
if ((ctlr->chip->chipid == ATA_ATI_IXP600) ||
(ctlr->chip->chipid == ATA_ATI_IXP700))
ctlr->channels = 1;
ctlr->setmode = ata_ati_setmode;
return 0;
}
То, что называется dirty hack. Несомненно, 2-е место, сразу после бессмертного творения неизвестного индуса:
int true_or_false(int value)
{
int ret;
if (value == 1) ret =true;
else if (value==0) ret=false;
return ret;
}
Для тех, кто не в курсе, но заинтересовался, поясняю: даже если у контроллера действительно один канал, то это совершенно не значит, что он прибит гвоздями к какому-то фиксированому месту. И вот это самое приведенное не нужно вообще. Без него все работает. С ним - не работает.