From 009adf2d4be9479004e41fd9b49a6136498f256b Mon Sep 17 00:00:00 2001 From: Aaro Koskinen Date: Mon, 29 Aug 2011 23:14:24 +0300 Subject: [PATCH] staging: xgifb: fix LVDS LCD resolution data setup If the driver fails to get LVDS LCD data from the firmware, it falls back to using driver's hardcoded values. However, this is done too early in the probe. The selected video mode index is not yet known, and also in some cases it could be defaulting to -1 resulting in a read outside the array. Fix this by moving the array lookup after the video mode validation. Signed-off-by: Aaro Koskinen Reported-by: Dan Carpenter Signed-off-by: Greg Kroah-Hartman --- drivers/staging/xgifb/XGI_main_26.c | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/drivers/staging/xgifb/XGI_main_26.c b/drivers/staging/xgifb/XGI_main_26.c index 80716874edab..e8bad0296daa 100644 --- a/drivers/staging/xgifb/XGI_main_26.c +++ b/drivers/staging/xgifb/XGI_main_26.c @@ -2021,6 +2021,7 @@ static int __devinit xgifb_probe(struct pci_dev *pdev, u8 reg, reg1; u8 CR48, CR38; int ret; + bool xgi21_drvlcdcaplist = false; memset(&XGIhw_ext, 0, sizeof(struct xgi_hw_device_info)); fb_info = framebuffer_alloc(sizeof(struct fb_info), &pdev->dev); @@ -2174,15 +2175,8 @@ static int __devinit xgifb_probe(struct pci_dev *pdev, CR38 = xgifb_reg_get(XGICR, 0x38); if ((CR38&0xE0) == 0xC0) { xgi_video_info.disp_state = DISPTYPE_LCD; - if (!XGIfb_GetXG21LVDSData()) { - int m; - for (m = 0; m < sizeof(XGI21_LCDCapList)/sizeof(struct XGI21_LVDSCapStruct); m++) { - if ((XGI21_LCDCapList[m].LVDSHDE == XGIbios_mode[xgifb_mode_idx].xres) && - (XGI21_LCDCapList[m].LVDSVDE == XGIbios_mode[xgifb_mode_idx].yres)) { - xgifb_reg_set(XGI_Pr.P3d4, 0x36, m); - } - } - } + if (!XGIfb_GetXG21LVDSData()) + xgi21_drvlcdcaplist = true; } else if ((CR38&0xE0) == 0x60) { xgi_video_info.hasVB = HASVB_CHRONTEL; } else { @@ -2334,6 +2328,19 @@ static int __devinit xgifb_probe(struct pci_dev *pdev, } } + if (xgi21_drvlcdcaplist) { + int m; + + for (m = 0; m < ARRAY_SIZE(XGI21_LCDCapList); m++) + if ((XGI21_LCDCapList[m].LVDSHDE == + XGIbios_mode[xgifb_mode_idx].xres) && + (XGI21_LCDCapList[m].LVDSVDE == + XGIbios_mode[xgifb_mode_idx].yres)) { + xgifb_reg_set(XGI_Pr.P3d4, 0x36, m); + break; + } + } + XGIfb_mode_no = XGIbios_mode[xgifb_mode_idx].mode_no; /* yilin set default refresh rate */ -- 2.11.0