Uopste nije problem u drajveru. Ne moze drajver sam od sebe nesto da radi.
Problem je izgleda sto je karticin eprom mapiran u memoriju i sto nesto
ili usled nekog race condition-a ili prilikom inicijalizacije napuni taj region memorije
sa 0xff. E sad posto nisu otkrili sta je to ocigledno nije nesto predvidjeno da
radi tako niti je nesto ocigledno ;)
btw izasao je fix.
Evo glavnog dela fix-a u driveru:
Code:
+void e1000e_write_protect_nvm_ich8lan(struct e1000_hw *hw)
+{
+ union ich8_flash_protected_range pr0;
+ union ich8_hws_flash_status hsfsts;
+ u32 gfpreg;
+ s32 ret_val;
+
+ ret_val = e1000_acquire_swflag_ich8lan(hw);
+ if (ret_val)
+ return;
+
+ gfpreg = er32flash(ICH_FLASH_GFPREG);
+
+ /* Write-protect GbE Sector of NVM */
+ pr0.regval = er32flash(ICH_FLASH_PR0);
+ pr0.range.base = gfpreg & FLASH_GFPREG_BASE_MASK;
+ pr0.range.limit = ((gfpreg >> 16) & FLASH_GFPREG_BASE_MASK);
+ pr0.range.wpe = true;
+ ew32flash(ICH_FLASH_PR0, pr0.regval);
+
+ /*
+ * Lock down a subset of GbE Flash Control Registers, e.g.
+ * PR0 to prevent the write-protection from being lifted.
+ * Once FLOCKDN is set, the registers protected by it cannot
+ * be written until FLOCKDN is cleared by a hardware reset.
+ */
+ hsfsts.regval = er16flash(ICH_FLASH_HSFSTS);
+ hsfsts.hsf_status.flockdn = true;
+ ew32flash(ICH_FLASH_HSFSTS, hsfsts.regval);
+
+ e1000_release_swflag_ich8lan(hw);
+}
Covek iz intela je prosto disablovao write tog regiona i zakljucao
registre preko kojih se omogucuje isti ;)
Dakle obezbedio se od bug-a koji je ko zna gde ;)
E sad dal kriviti intelove ljude sto to nisu uradili na prvom mestu ;) ili intelove dizajnere
hardvera koji su to napravili tako da je mapiran flash rom sa r/w privilegijama
i pre inicijalizacije drajvera ;)
U svakom slucaju softver ne bi trebalo da moze da sredi hw.
Pozdrav!