framebuffer_release() is missing from error paths.
Signed-off-by: Aaro Koskinen <[email protected]>
---
drivers/staging/xgifb/XGI_main_26.c | 39 +++++++++++++++++++++++++---------
1 files changed, 28 insertions(+), 11 deletions(-)
diff --git a/drivers/staging/xgifb/XGI_main_26.c b/drivers/staging/xgifb/XGI_main_26.c
index ee008e5..c245de4 100644
--- a/drivers/staging/xgifb/XGI_main_26.c
+++ b/drivers/staging/xgifb/XGI_main_26.c
@@ -2935,6 +2935,8 @@ static int __devinit xgifb_probe(struct pci_dev *pdev,
u16 reg16;
u8 reg, reg1;
u8 CR48, CR38;
+ int ret;
+
if (XGIfb_off)
return -ENXIO;
@@ -2966,8 +2968,10 @@ static int __devinit xgifb_probe(struct pci_dev *pdev,
printk("XGIfb: Relocate IO address: %lx [%08lx]\n",
(unsigned long)pci_resource_start(pdev, 2), XGI_Pr.RelIO);
- if (pci_enable_device(pdev))
- return -EIO;
+ if (pci_enable_device(pdev)) {
+ ret = -EIO;
+ goto error;
+ }
XGIRegInit(&XGI_Pr, (unsigned long)XGIhw_ext.pjIOAddress);
@@ -2976,7 +2980,8 @@ static int __devinit xgifb_probe(struct pci_dev *pdev,
if (reg1 != 0xa1) { /*I/O error */
printk("\nXGIfb: I/O error!!!");
- return -EIO;
+ ret = -EIO;
+ goto error;
}
switch (xgi_video_info.chip_id) {
@@ -3011,7 +3016,8 @@ static int __devinit xgifb_probe(struct pci_dev *pdev,
XGIfb_CRT2_write_enable = IND_XGI_CRT2_WRITE_ENABLE_315;
break;
default:
- return -ENODEV;
+ ret = -ENODEV;
+ goto error;
}
printk("XGIfb:chipid = %x\n", xgi_video_info.chip);
@@ -3052,7 +3058,8 @@ static int __devinit xgifb_probe(struct pci_dev *pdev,
XGIhw_ext.pSR = vmalloc(sizeof(struct XGI_DSReg) * SR_BUFFER_SIZE);
if (XGIhw_ext.pSR == NULL) {
printk(KERN_ERR "XGIfb: Fatal error: Allocating SRReg space failed.\n");
- return -ENODEV;
+ ret = -ENODEV;
+ goto error;
}
XGIhw_ext.pSR[0].jIdx = XGIhw_ext.pSR[0].jVal = 0xFF;
@@ -3060,7 +3067,8 @@ static int __devinit xgifb_probe(struct pci_dev *pdev,
if (XGIhw_ext.pCR == NULL) {
vfree(XGIhw_ext.pSR);
printk(KERN_ERR "XGIfb: Fatal error: Allocating CRReg space failed.\n");
- return -ENODEV;
+ ret = -ENODEV;
+ goto error;
}
XGIhw_ext.pCR[0].jIdx = XGIhw_ext.pCR[0].jVal = 0xFF;
@@ -3100,7 +3108,8 @@ static int __devinit xgifb_probe(struct pci_dev *pdev,
vfree(XGIhw_ext.pSR);
vfree(XGIhw_ext.pCR);
printk(KERN_INFO "XGIfb: Fatal error: Unable to determine RAM size.\n");
- return -ENODEV;
+ ret = -ENODEV;
+ goto error;
}
if ((xgifb_mode_idx < 0) || ((XGIbios_mode[xgifb_mode_idx].mode_no) != 0xFF)) {
@@ -3118,7 +3127,8 @@ static int __devinit xgifb_probe(struct pci_dev *pdev,
printk(KERN_ERR "XGIfb: Is there another framebuffer driver active?\n");
vfree(XGIhw_ext.pSR);
vfree(XGIhw_ext.pCR);
- return -ENODEV;
+ ret = -ENODEV;
+ goto error;
}
if (!request_mem_region(xgi_video_info.mmio_base, XGIfb_mmio_size, "XGIfb MMIO")) {
@@ -3126,7 +3136,8 @@ static int __devinit xgifb_probe(struct pci_dev *pdev,
release_mem_region(xgi_video_info.video_base, xgi_video_info.video_size);
vfree(XGIhw_ext.pSR);
vfree(XGIhw_ext.pCR);
- return -ENODEV;
+ ret = -ENODEV;
+ goto error;
}
xgi_video_info.video_vbase = XGIhw_ext.pjVideoMemoryAddress =
@@ -3413,8 +3424,10 @@ static int __devinit xgifb_probe(struct pci_dev *pdev,
printk(KERN_INFO "XGIfb: Added MTRRs\n");
#endif
- if (register_framebuffer(fb_info) < 0)
- return -EINVAL;
+ if (register_framebuffer(fb_info) < 0) {
+ ret = -EINVAL;
+ goto error;
+ }
XGIfb_registered = 1;
@@ -3426,6 +3439,10 @@ static int __devinit xgifb_probe(struct pci_dev *pdev,
dumpVGAReg();
return 0;
+
+error:
+ framebuffer_release(fb_info);
+ return ret;
}
/*****************************************************/
--
1.5.6.5
XGINew_LCD_Wait_Time() is implemented using the I/O port 0x61, which is
X86-specific and will fail on other platforms. The code did not make any
sense, but I guess the intention has been to provide a function where
the unit for the delay is milliseconds.
Signed-off-by: Aaro Koskinen <[email protected]>
---
drivers/staging/xgifb/vb_setmode.c | 47 +++++++----------------------------
1 files changed, 10 insertions(+), 37 deletions(-)
diff --git a/drivers/staging/xgifb/vb_setmode.c b/drivers/staging/xgifb/vb_setmode.c
index e19b932..fa2cf96 100644
--- a/drivers/staging/xgifb/vb_setmode.c
+++ b/drivers/staging/xgifb/vb_setmode.c
@@ -1,5 +1,6 @@
#include <asm/io.h>
+#include <linux/delay.h>
#include <linux/types.h>
#include <linux/version.h>
#include "XGIfb.h"
@@ -161,7 +162,6 @@ void XGI_GetRAMDAC2DATA(unsigned short ModeNo, unsigned short ModeIdIndex, u
void XGI_UnLockCRT2(struct xgi_hw_device_info *, struct vb_device_info *pVBInfo);
void XGI_LockCRT2(struct xgi_hw_device_info *, struct vb_device_info *pVBInfo);
void XGINew_EnableCRT2(struct vb_device_info *pVBInfo);
-void XGINew_LCD_Wait_Time(unsigned char DelayTime, struct vb_device_info *pVBInfo);
void XGI_LongWait(struct vb_device_info *pVBInfo);
void XGI_SetCRT1Offset(unsigned short ModeNo, unsigned short ModeIdIndex, unsigned short RefreshRateTableIndex, struct xgi_hw_device_info *HwDeviceExtension, struct vb_device_info *pVBInfo);
void XGI_GetLCDVCLKPtr(unsigned char *di_0, unsigned char *di_1,
@@ -3788,7 +3788,7 @@ void XGI_SenseCRT1(struct vb_device_info *pVBInfo)
XGI_VBLongWait(pVBInfo);
XGI_VBLongWait(pVBInfo);
- XGINew_LCD_Wait_Time(0x01, pVBInfo);
+ mdelay(1);
XGI_WaitDisply(pVBInfo);
temp = XGINew_GetReg2(pVBInfo->P3c2);
@@ -6716,16 +6716,16 @@ void XGI_SetPanelDelay(unsigned short tempbl, struct vb_device_info *pVBInfo)
index = XGI_GetLCDCapPtr(pVBInfo);
if (tempbl == 1)
- XGINew_LCD_Wait_Time(pVBInfo->LCDCapList[index].PSC_S1, pVBInfo);
+ mdelay(pVBInfo->LCDCapList[index].PSC_S1);
if (tempbl == 2)
- XGINew_LCD_Wait_Time(pVBInfo->LCDCapList[index].PSC_S2, pVBInfo);
+ mdelay(pVBInfo->LCDCapList[index].PSC_S2);
if (tempbl == 3)
- XGINew_LCD_Wait_Time(pVBInfo->LCDCapList[index].PSC_S3, pVBInfo);
+ mdelay(pVBInfo->LCDCapList[index].PSC_S3);
if (tempbl == 4)
- XGINew_LCD_Wait_Time(pVBInfo->LCDCapList[index].PSC_S4, pVBInfo);
+ mdelay(pVBInfo->LCDCapList[index].PSC_S4);
}
/* --------------------------------------------------------------------- */
@@ -6897,20 +6897,16 @@ void XGI_XG21SetPanelDelay(unsigned short tempbl,
index = XGI_GetLVDSOEMTableIndex(pVBInfo);
if (tempbl == 1)
- XGINew_LCD_Wait_Time(pVBInfo->XG21_LVDSCapList[index].PSC_S1,
- pVBInfo);
+ mdelay(pVBInfo->XG21_LVDSCapList[index].PSC_S1);
if (tempbl == 2)
- XGINew_LCD_Wait_Time(pVBInfo->XG21_LVDSCapList[index].PSC_S2,
- pVBInfo);
+ mdelay(pVBInfo->XG21_LVDSCapList[index].PSC_S2);
if (tempbl == 3)
- XGINew_LCD_Wait_Time(pVBInfo->XG21_LVDSCapList[index].PSC_S3,
- pVBInfo);
+ mdelay(pVBInfo->XG21_LVDSCapList[index].PSC_S3);
if (tempbl == 4)
- XGINew_LCD_Wait_Time(pVBInfo->XG21_LVDSCapList[index].PSC_S4,
- pVBInfo);
+ mdelay(pVBInfo->XG21_LVDSCapList[index].PSC_S4);
}
unsigned char XGI_XG21CheckLVDSMode(unsigned short ModeNo,
@@ -8637,29 +8633,6 @@ void XGINew_EnableCRT2(struct vb_device_info *pVBInfo)
XGINew_SetRegANDOR(pVBInfo->P3c4, 0x1E, 0xFF, 0x20);
}
-void XGINew_LCD_Wait_Time(unsigned char DelayTime,
- struct vb_device_info *pVBInfo)
-{
- unsigned short i, j;
-
- unsigned long temp, flag;
-
- flag = 0;
- /* printk("XGINew_LCD_Wait_Time"); */
- /* return; */
- for (i = 0; i < DelayTime; i++) {
- for (j = 0; j < 66; j++) {
- temp = XGINew_GetReg3(0x61);
- /* temp &= 0x10000000; */
- temp &= 0x10;
- if (temp == flag)
- continue;
-
- flag = temp;
- }
- }
-}
-
unsigned char XGI_BridgeIsOn(struct vb_device_info *pVBInfo)
{
unsigned short flag;
--
1.5.6.5
Delete redudant comments, blank lines and a redundant semicolon.
Signed-off-by: Aaro Koskinen <[email protected]>
---
drivers/staging/xgifb/XGI_main_26.c | 7 +------
1 files changed, 1 insertions(+), 6 deletions(-)
diff --git a/drivers/staging/xgifb/XGI_main_26.c b/drivers/staging/xgifb/XGI_main_26.c
index f69ff57..6e86830 100644
--- a/drivers/staging/xgifb/XGI_main_26.c
+++ b/drivers/staging/xgifb/XGI_main_26.c
@@ -3428,8 +3428,6 @@ error:
static void __devexit xgifb_remove(struct pci_dev *pdev)
{
- /* Unregister the framebuffer */
- /* if (xgi_video_info.registered) { */
unregister_framebuffer(fb_info);
iounmap(xgi_video_info.mmio_vbase);
iounmap(xgi_video_info.video_vbase);
@@ -3438,11 +3436,8 @@ static void __devexit xgifb_remove(struct pci_dev *pdev)
xgi_video_info.video_size);
vfree(XGIhw_ext.pjVirtualRomBase);
framebuffer_release(fb_info);
- /* } */
-
pci_set_drvdata(pdev, NULL);
-
-};
+}
static struct pci_driver xgifb_driver = {
.name = "xgifb",
--
1.5.6.5
Release and unmap memory on probe error paths and when the module
is removed.
The patch enables unloading and reloading the xgifb module.
Signed-off-by: Aaro Koskinen <[email protected]>
---
drivers/staging/xgifb/XGI_main_26.c | 17 ++++++++++++++---
1 files changed, 14 insertions(+), 3 deletions(-)
diff --git a/drivers/staging/xgifb/XGI_main_26.c b/drivers/staging/xgifb/XGI_main_26.c
index 90dca40..f69ff57 100644
--- a/drivers/staging/xgifb/XGI_main_26.c
+++ b/drivers/staging/xgifb/XGI_main_26.c
@@ -3103,9 +3103,8 @@ static int __devinit xgifb_probe(struct pci_dev *pdev,
if (!request_mem_region(xgi_video_info.mmio_base, XGIfb_mmio_size, "XGIfb MMIO")) {
printk(KERN_ERR "XGIfb: Fatal error: Unable to reserve MMIO region\n");
- release_mem_region(xgi_video_info.video_base, xgi_video_info.video_size);
ret = -ENODEV;
- goto error;
+ goto error_0;
}
xgi_video_info.video_vbase = XGIhw_ext.pjVideoMemoryAddress =
@@ -3394,7 +3393,7 @@ static int __devinit xgifb_probe(struct pci_dev *pdev,
if (register_framebuffer(fb_info) < 0) {
ret = -EINVAL;
- goto error;
+ goto error_1;
}
XGIfb_registered = 1;
@@ -3408,6 +3407,13 @@ static int __devinit xgifb_probe(struct pci_dev *pdev,
return 0;
+error_1:
+ iounmap(xgi_video_info.mmio_vbase);
+ iounmap(xgi_video_info.video_vbase);
+ release_mem_region(xgi_video_info.mmio_base, XGIfb_mmio_size);
+error_0:
+ release_mem_region(xgi_video_info.video_base,
+ xgi_video_info.video_size);
error:
vfree(XGIhw_ext.pjVirtualRomBase);
vfree(XGIhw_ext.pSR);
@@ -3425,6 +3431,11 @@ static void __devexit xgifb_remove(struct pci_dev *pdev)
/* Unregister the framebuffer */
/* if (xgi_video_info.registered) { */
unregister_framebuffer(fb_info);
+ iounmap(xgi_video_info.mmio_vbase);
+ iounmap(xgi_video_info.video_vbase);
+ release_mem_region(xgi_video_info.mmio_base, XGIfb_mmio_size);
+ release_mem_region(xgi_video_info.video_base,
+ xgi_video_info.video_size);
vfree(XGIhw_ext.pjVirtualRomBase);
framebuffer_release(fb_info);
/* } */
--
1.5.6.5
Some xgifb_probe() error paths are missing proper vfree()s. Move them
all into a single place.
Signed-off-by: Aaro Koskinen <[email protected]>
---
drivers/staging/xgifb/XGI_main_26.c | 9 ++-------
1 files changed, 2 insertions(+), 7 deletions(-)
diff --git a/drivers/staging/xgifb/XGI_main_26.c b/drivers/staging/xgifb/XGI_main_26.c
index c245de4..2328926 100644
--- a/drivers/staging/xgifb/XGI_main_26.c
+++ b/drivers/staging/xgifb/XGI_main_26.c
@@ -3065,7 +3065,6 @@ static int __devinit xgifb_probe(struct pci_dev *pdev,
XGIhw_ext.pCR = vmalloc(sizeof(struct XGI_DSReg) * CR_BUFFER_SIZE);
if (XGIhw_ext.pCR == NULL) {
- vfree(XGIhw_ext.pSR);
printk(KERN_ERR "XGIfb: Fatal error: Allocating CRReg space failed.\n");
ret = -ENODEV;
goto error;
@@ -3105,8 +3104,6 @@ static int __devinit xgifb_probe(struct pci_dev *pdev,
}
#endif
if (XGIfb_get_dram_size()) {
- vfree(XGIhw_ext.pSR);
- vfree(XGIhw_ext.pCR);
printk(KERN_INFO "XGIfb: Fatal error: Unable to determine RAM size.\n");
ret = -ENODEV;
goto error;
@@ -3125,8 +3122,6 @@ static int __devinit xgifb_probe(struct pci_dev *pdev,
printk("unable request memory size %x", xgi_video_info.video_size);
printk(KERN_ERR "XGIfb: Fatal error: Unable to reserve frame buffer memory\n");
printk(KERN_ERR "XGIfb: Is there another framebuffer driver active?\n");
- vfree(XGIhw_ext.pSR);
- vfree(XGIhw_ext.pCR);
ret = -ENODEV;
goto error;
}
@@ -3134,8 +3129,6 @@ static int __devinit xgifb_probe(struct pci_dev *pdev,
if (!request_mem_region(xgi_video_info.mmio_base, XGIfb_mmio_size, "XGIfb MMIO")) {
printk(KERN_ERR "XGIfb: Fatal error: Unable to reserve MMIO region\n");
release_mem_region(xgi_video_info.video_base, xgi_video_info.video_size);
- vfree(XGIhw_ext.pSR);
- vfree(XGIhw_ext.pCR);
ret = -ENODEV;
goto error;
}
@@ -3441,6 +3434,8 @@ static int __devinit xgifb_probe(struct pci_dev *pdev,
return 0;
error:
+ vfree(XGIhw_ext.pSR);
+ vfree(XGIhw_ext.pCR);
framebuffer_release(fb_info);
return ret;
}
--
1.5.6.5
Use proper helper functions to copy the PCI ROM. Also use dynamic memory
allocation. The original code mapped incorrect amount of memory and will
crash on some platforms.
Signed-off-by: Aaro Koskinen <[email protected]>
---
drivers/staging/xgifb/XGI_main_26.c | 61 +++++++++++------------------------
1 files changed, 19 insertions(+), 42 deletions(-)
diff --git a/drivers/staging/xgifb/XGI_main_26.c b/drivers/staging/xgifb/XGI_main_26.c
index 2328926..90dca40 100644
--- a/drivers/staging/xgifb/XGI_main_26.c
+++ b/drivers/staging/xgifb/XGI_main_26.c
@@ -54,6 +54,8 @@ int XGIfb_accel = 0;
#define GPIOG_READ (1<<1)
int XGIfb_GetXG21DefaultLVDSModeIdx(void);
+#define XGIFB_ROM_SIZE 65536
+
/* -------------------- Macro definitions ---------------------------- */
#undef XGIFBDEBUG
@@ -2881,52 +2883,26 @@ XGIINITSTATIC int __init XGIfb_setup(char *options)
return 0;
}
-static unsigned char VBIOS_BUF[65535];
-
-static unsigned char *attempt_map_rom(struct pci_dev *dev, void *copy_address)
+static unsigned char *xgifb_copy_rom(struct pci_dev *dev)
{
- u32 rom_size = 0;
- u32 rom_address = 0;
- int j;
-
- /* Get the size of the expansion rom */
- pci_write_config_dword(dev, PCI_ROM_ADDRESS, 0xFFFFFFFF);
- pci_read_config_dword(dev, PCI_ROM_ADDRESS, &rom_size);
- if ((rom_size & 0x01) == 0) {
- printk("No ROM\n");
- return NULL;
- }
+ void __iomem *rom_address;
+ unsigned char *rom_copy;
+ size_t rom_size;
- rom_size &= 0xFFFFF800;
- rom_size = (~rom_size) + 1;
-
- rom_address = pci_resource_start(dev, 0);
- if (rom_address == 0 || rom_address == 0xFFFFFFF0) {
- printk("No suitable rom address found\n");
+ rom_address = pci_map_rom(dev, &rom_size);
+ if (rom_address == NULL)
return NULL;
- }
- printk("ROM Size is %dK, Address is %x\n", rom_size / 1024, rom_address);
+ rom_copy = vzalloc(XGIFB_ROM_SIZE);
+ if (rom_copy == NULL)
+ goto done;
- /* Map ROM */
- pci_write_config_dword(dev, PCI_ROM_ADDRESS, rom_address
- | PCI_ROM_ADDRESS_ENABLE);
+ rom_size = min_t(size_t, rom_size, XGIFB_ROM_SIZE);
+ memcpy_fromio(rom_copy, rom_address, rom_size);
- /* memcpy(copy_address, rom_address, rom_size); */
- {
- unsigned char *virt_addr = ioremap(rom_address, 0x8000000);
-
- unsigned char *from = (unsigned char *) virt_addr;
- unsigned char *to = (unsigned char *) copy_address;
- for (j = 0; j < 65536 /*rom_size*/; j++)
- *to++ = *from++;
- }
-
- pci_write_config_dword(dev, PCI_ROM_ADDRESS, 0);
-
- printk("Copy is done\n");
-
- return copy_address;
+done:
+ pci_unmap_rom(dev, rom_address);
+ return rom_copy;
}
static int __devinit xgifb_probe(struct pci_dev *pdev,
@@ -3039,8 +3015,7 @@ static int __devinit xgifb_probe(struct pci_dev *pdev,
XGIhw_ext.pDevice = NULL;
if ((xgi_video_info.chip == XG21) || (XGIfb_userom)) {
- XGIhw_ext.pjVirtualRomBase = attempt_map_rom(pdev, VBIOS_BUF);
-
+ XGIhw_ext.pjVirtualRomBase = xgifb_copy_rom(pdev);
if (XGIhw_ext.pjVirtualRomBase)
printk(KERN_INFO "XGIfb: Video ROM found and mapped to %p\n", XGIhw_ext.pjVirtualRomBase);
else
@@ -3434,6 +3409,7 @@ static int __devinit xgifb_probe(struct pci_dev *pdev,
return 0;
error:
+ vfree(XGIhw_ext.pjVirtualRomBase);
vfree(XGIhw_ext.pSR);
vfree(XGIhw_ext.pCR);
framebuffer_release(fb_info);
@@ -3449,6 +3425,7 @@ static void __devexit xgifb_remove(struct pci_dev *pdev)
/* Unregister the framebuffer */
/* if (xgi_video_info.registered) { */
unregister_framebuffer(fb_info);
+ vfree(XGIhw_ext.pjVirtualRomBase);
framebuffer_release(fb_info);
/* } */
--
1.5.6.5
Move the XGIfb_mmio_size global variable into the video_info struct.
Signed-off-by: Aaro Koskinen <[email protected]>
---
drivers/staging/xgifb/XGI_main.h | 1 -
drivers/staging/xgifb/XGI_main_26.c | 18 +++++++++++-------
drivers/staging/xgifb/XGIfb.h | 1 +
3 files changed, 12 insertions(+), 8 deletions(-)
diff --git a/drivers/staging/xgifb/XGI_main.h b/drivers/staging/xgifb/XGI_main.h
index 72448e8..e8e2bfe 100644
--- a/drivers/staging/xgifb/XGI_main.h
+++ b/drivers/staging/xgifb/XGI_main.h
@@ -375,7 +375,6 @@ static struct xgi_hw_device_info XGIhw_ext;
static struct vb_device_info XGI_Pr;
/* card parameters */
-static unsigned long XGIfb_mmio_size = 0;
static u8 XGIfb_caps = 0;
typedef enum _XGI_CMDTYPE {
diff --git a/drivers/staging/xgifb/XGI_main_26.c b/drivers/staging/xgifb/XGI_main_26.c
index 6e86830..7f821ae 100644
--- a/drivers/staging/xgifb/XGI_main_26.c
+++ b/drivers/staging/xgifb/XGI_main_26.c
@@ -1723,7 +1723,7 @@ static int XGIfb_get_fix(struct fb_fix_screeninfo *fix, int con,
fix->ywrapstep = 0;
fix->line_length = xgi_video_info.video_linelength;
fix->mmio_start = xgi_video_info.mmio_base;
- fix->mmio_len = XGIfb_mmio_size;
+ fix->mmio_len = xgi_video_info.mmio_size;
if (xgi_video_info.chip >= XG40)
fix->accel = FB_ACCEL_XGI_XABRE;
else
@@ -2937,7 +2937,7 @@ static int __devinit xgifb_probe(struct pci_dev *pdev,
xgi_video_info.video_base = pci_resource_start(pdev, 0);
xgi_video_info.mmio_base = pci_resource_start(pdev, 1);
- XGIfb_mmio_size = pci_resource_len(pdev, 1);
+ xgi_video_info.mmio_size = pci_resource_len(pdev, 1);
xgi_video_info.vga_base = pci_resource_start(pdev, 2) + 0x30;
XGIhw_ext.pjIOAddress = (unsigned char *)xgi_video_info.vga_base;
/* XGI_Pr.RelIO = ioremap(pci_resource_start(pdev, 2), 128) + 0x30; */
@@ -3101,7 +3101,9 @@ static int __devinit xgifb_probe(struct pci_dev *pdev,
goto error;
}
- if (!request_mem_region(xgi_video_info.mmio_base, XGIfb_mmio_size, "XGIfb MMIO")) {
+ if (!request_mem_region(xgi_video_info.mmio_base,
+ xgi_video_info.mmio_size,
+ "XGIfb MMIO")) {
printk(KERN_ERR "XGIfb: Fatal error: Unable to reserve MMIO region\n");
ret = -ENODEV;
goto error_0;
@@ -3109,13 +3111,15 @@ static int __devinit xgifb_probe(struct pci_dev *pdev,
xgi_video_info.video_vbase = XGIhw_ext.pjVideoMemoryAddress =
ioremap(xgi_video_info.video_base, xgi_video_info.video_size);
- xgi_video_info.mmio_vbase = ioremap(xgi_video_info.mmio_base, XGIfb_mmio_size);
+ xgi_video_info.mmio_vbase = ioremap(xgi_video_info.mmio_base,
+ xgi_video_info.mmio_size);
printk(KERN_INFO "XGIfb: Framebuffer at 0x%lx, mapped to 0x%p, size %dk\n",
xgi_video_info.video_base, xgi_video_info.video_vbase, xgi_video_info.video_size / 1024);
printk(KERN_INFO "XGIfb: MMIO at 0x%lx, mapped to 0x%p, size %ldk\n",
- xgi_video_info.mmio_base, xgi_video_info.mmio_vbase, XGIfb_mmio_size / 1024);
+ xgi_video_info.mmio_base, xgi_video_info.mmio_vbase,
+ xgi_video_info.mmio_size / 1024);
printk("XGIfb: XGIInitNew() ...");
if (XGIInitNew(&XGIhw_ext))
printk("OK\n");
@@ -3410,7 +3414,7 @@ static int __devinit xgifb_probe(struct pci_dev *pdev,
error_1:
iounmap(xgi_video_info.mmio_vbase);
iounmap(xgi_video_info.video_vbase);
- release_mem_region(xgi_video_info.mmio_base, XGIfb_mmio_size);
+ release_mem_region(xgi_video_info.mmio_base, xgi_video_info.mmio_size);
error_0:
release_mem_region(xgi_video_info.video_base,
xgi_video_info.video_size);
@@ -3431,7 +3435,7 @@ static void __devexit xgifb_remove(struct pci_dev *pdev)
unregister_framebuffer(fb_info);
iounmap(xgi_video_info.mmio_vbase);
iounmap(xgi_video_info.video_vbase);
- release_mem_region(xgi_video_info.mmio_base, XGIfb_mmio_size);
+ release_mem_region(xgi_video_info.mmio_base, xgi_video_info.mmio_size);
release_mem_region(xgi_video_info.video_base,
xgi_video_info.video_size);
vfree(XGIhw_ext.pjVirtualRomBase);
diff --git a/drivers/staging/xgifb/XGIfb.h b/drivers/staging/xgifb/XGIfb.h
index ef86a64..bb4640a 100644
--- a/drivers/staging/xgifb/XGIfb.h
+++ b/drivers/staging/xgifb/XGIfb.h
@@ -161,6 +161,7 @@ struct video_info{
unsigned long video_base;
char * video_vbase;
unsigned long mmio_base;
+ unsigned long mmio_size;
char * mmio_vbase;
unsigned long vga_base;
unsigned long mtrr;
--
1.5.6.5