|
@@ -118,6 +118,7 @@
|
|
* @pch_mac_start_address: MAC address area start address
|
|
* @pch_mac_start_address: MAC address area start address
|
|
* @pch_opt_rom_start_address: Option ROM start address
|
|
* @pch_opt_rom_start_address: Option ROM start address
|
|
* @ioh_type: Save IOH type
|
|
* @ioh_type: Save IOH type
|
|
|
|
+ * @pdev: pointer to pci device struct
|
|
*/
|
|
*/
|
|
struct pch_phub_reg {
|
|
struct pch_phub_reg {
|
|
u32 phub_id_reg;
|
|
u32 phub_id_reg;
|
|
@@ -139,6 +140,7 @@ struct pch_phub_reg {
|
|
u32 pch_mac_start_address;
|
|
u32 pch_mac_start_address;
|
|
u32 pch_opt_rom_start_address;
|
|
u32 pch_opt_rom_start_address;
|
|
int ioh_type;
|
|
int ioh_type;
|
|
|
|
+ struct pci_dev *pdev;
|
|
};
|
|
};
|
|
|
|
|
|
/* SROM SPEC for MAC address assignment offset */
|
|
/* SROM SPEC for MAC address assignment offset */
|
|
@@ -501,6 +503,7 @@ static ssize_t pch_phub_bin_read(struct file *filp, struct kobject *kobj,
|
|
unsigned int orom_size;
|
|
unsigned int orom_size;
|
|
int ret;
|
|
int ret;
|
|
int err;
|
|
int err;
|
|
|
|
+ ssize_t rom_size;
|
|
|
|
|
|
struct pch_phub_reg *chip =
|
|
struct pch_phub_reg *chip =
|
|
dev_get_drvdata(container_of(kobj, struct device, kobj));
|
|
dev_get_drvdata(container_of(kobj, struct device, kobj));
|
|
@@ -512,6 +515,10 @@ static ssize_t pch_phub_bin_read(struct file *filp, struct kobject *kobj,
|
|
}
|
|
}
|
|
|
|
|
|
/* Get Rom signature */
|
|
/* Get Rom signature */
|
|
|
|
+ chip->pch_phub_extrom_base_address = pci_map_rom(chip->pdev, &rom_size);
|
|
|
|
+ if (!chip->pch_phub_extrom_base_address)
|
|
|
|
+ goto exrom_map_err;
|
|
|
|
+
|
|
pch_phub_read_serial_rom(chip, chip->pch_opt_rom_start_address,
|
|
pch_phub_read_serial_rom(chip, chip->pch_opt_rom_start_address,
|
|
(unsigned char *)&rom_signature);
|
|
(unsigned char *)&rom_signature);
|
|
rom_signature &= 0xff;
|
|
rom_signature &= 0xff;
|
|
@@ -542,10 +549,13 @@ static ssize_t pch_phub_bin_read(struct file *filp, struct kobject *kobj,
|
|
goto return_err;
|
|
goto return_err;
|
|
}
|
|
}
|
|
return_ok:
|
|
return_ok:
|
|
|
|
+ pci_unmap_rom(chip->pdev, chip->pch_phub_extrom_base_address);
|
|
mutex_unlock(&pch_phub_mutex);
|
|
mutex_unlock(&pch_phub_mutex);
|
|
return addr_offset;
|
|
return addr_offset;
|
|
|
|
|
|
return_err:
|
|
return_err:
|
|
|
|
+ pci_unmap_rom(chip->pdev, chip->pch_phub_extrom_base_address);
|
|
|
|
+exrom_map_err:
|
|
mutex_unlock(&pch_phub_mutex);
|
|
mutex_unlock(&pch_phub_mutex);
|
|
return_err_nomutex:
|
|
return_err_nomutex:
|
|
return err;
|
|
return err;
|
|
@@ -558,6 +568,7 @@ static ssize_t pch_phub_bin_write(struct file *filp, struct kobject *kobj,
|
|
int err;
|
|
int err;
|
|
unsigned int addr_offset;
|
|
unsigned int addr_offset;
|
|
int ret;
|
|
int ret;
|
|
|
|
+ ssize_t rom_size;
|
|
struct pch_phub_reg *chip =
|
|
struct pch_phub_reg *chip =
|
|
dev_get_drvdata(container_of(kobj, struct device, kobj));
|
|
dev_get_drvdata(container_of(kobj, struct device, kobj));
|
|
|
|
|
|
@@ -574,6 +585,12 @@ static ssize_t pch_phub_bin_write(struct file *filp, struct kobject *kobj,
|
|
goto return_ok;
|
|
goto return_ok;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ chip->pch_phub_extrom_base_address = pci_map_rom(chip->pdev, &rom_size);
|
|
|
|
+ if (!chip->pch_phub_extrom_base_address) {
|
|
|
|
+ err = -ENOMEM;
|
|
|
|
+ goto exrom_map_err;
|
|
|
|
+ }
|
|
|
|
+
|
|
for (addr_offset = 0; addr_offset < count; addr_offset++) {
|
|
for (addr_offset = 0; addr_offset < count; addr_offset++) {
|
|
if (PCH_PHUB_OROM_SIZE < off + addr_offset)
|
|
if (PCH_PHUB_OROM_SIZE < off + addr_offset)
|
|
goto return_ok;
|
|
goto return_ok;
|
|
@@ -588,10 +605,14 @@ static ssize_t pch_phub_bin_write(struct file *filp, struct kobject *kobj,
|
|
}
|
|
}
|
|
|
|
|
|
return_ok:
|
|
return_ok:
|
|
|
|
+ pci_unmap_rom(chip->pdev, chip->pch_phub_extrom_base_address);
|
|
mutex_unlock(&pch_phub_mutex);
|
|
mutex_unlock(&pch_phub_mutex);
|
|
return addr_offset;
|
|
return addr_offset;
|
|
|
|
|
|
return_err:
|
|
return_err:
|
|
|
|
+ pci_unmap_rom(chip->pdev, chip->pch_phub_extrom_base_address);
|
|
|
|
+
|
|
|
|
+exrom_map_err:
|
|
mutex_unlock(&pch_phub_mutex);
|
|
mutex_unlock(&pch_phub_mutex);
|
|
return err;
|
|
return err;
|
|
}
|
|
}
|
|
@@ -601,8 +622,14 @@ static ssize_t show_pch_mac(struct device *dev, struct device_attribute *attr,
|
|
{
|
|
{
|
|
u8 mac[8];
|
|
u8 mac[8];
|
|
struct pch_phub_reg *chip = dev_get_drvdata(dev);
|
|
struct pch_phub_reg *chip = dev_get_drvdata(dev);
|
|
|
|
+ ssize_t rom_size;
|
|
|
|
+
|
|
|
|
+ chip->pch_phub_extrom_base_address = pci_map_rom(chip->pdev, &rom_size);
|
|
|
|
+ if (!chip->pch_phub_extrom_base_address)
|
|
|
|
+ return -ENOMEM;
|
|
|
|
|
|
pch_phub_read_gbe_mac_addr(chip, mac);
|
|
pch_phub_read_gbe_mac_addr(chip, mac);
|
|
|
|
+ pci_unmap_rom(chip->pdev, chip->pch_phub_extrom_base_address);
|
|
|
|
|
|
return sprintf(buf, "%pM\n", mac);
|
|
return sprintf(buf, "%pM\n", mac);
|
|
}
|
|
}
|
|
@@ -611,6 +638,7 @@ static ssize_t store_pch_mac(struct device *dev, struct device_attribute *attr,
|
|
const char *buf, size_t count)
|
|
const char *buf, size_t count)
|
|
{
|
|
{
|
|
u8 mac[6];
|
|
u8 mac[6];
|
|
|
|
+ ssize_t rom_size;
|
|
struct pch_phub_reg *chip = dev_get_drvdata(dev);
|
|
struct pch_phub_reg *chip = dev_get_drvdata(dev);
|
|
|
|
|
|
if (count != 18)
|
|
if (count != 18)
|
|
@@ -620,7 +648,12 @@ static ssize_t store_pch_mac(struct device *dev, struct device_attribute *attr,
|
|
(u32 *)&mac[0], (u32 *)&mac[1], (u32 *)&mac[2], (u32 *)&mac[3],
|
|
(u32 *)&mac[0], (u32 *)&mac[1], (u32 *)&mac[2], (u32 *)&mac[3],
|
|
(u32 *)&mac[4], (u32 *)&mac[5]);
|
|
(u32 *)&mac[4], (u32 *)&mac[5]);
|
|
|
|
|
|
|
|
+ chip->pch_phub_extrom_base_address = pci_map_rom(chip->pdev, &rom_size);
|
|
|
|
+ if (!chip->pch_phub_extrom_base_address)
|
|
|
|
+ return -ENOMEM;
|
|
|
|
+
|
|
pch_phub_write_gbe_mac_addr(chip, mac);
|
|
pch_phub_write_gbe_mac_addr(chip, mac);
|
|
|
|
+ pci_unmap_rom(chip->pdev, chip->pch_phub_extrom_base_address);
|
|
|
|
|
|
return count;
|
|
return count;
|
|
}
|
|
}
|
|
@@ -643,7 +676,6 @@ static int __devinit pch_phub_probe(struct pci_dev *pdev,
|
|
int retval;
|
|
int retval;
|
|
|
|
|
|
int ret;
|
|
int ret;
|
|
- ssize_t rom_size;
|
|
|
|
struct pch_phub_reg *chip;
|
|
struct pch_phub_reg *chip;
|
|
|
|
|
|
chip = kzalloc(sizeof(struct pch_phub_reg), GFP_KERNEL);
|
|
chip = kzalloc(sizeof(struct pch_phub_reg), GFP_KERNEL);
|
|
@@ -680,19 +712,7 @@ static int __devinit pch_phub_probe(struct pci_dev *pdev,
|
|
"in pch_phub_base_address variable is %p\n", __func__,
|
|
"in pch_phub_base_address variable is %p\n", __func__,
|
|
chip->pch_phub_base_address);
|
|
chip->pch_phub_base_address);
|
|
|
|
|
|
- if (id->driver_data != 3) {
|
|
|
|
- chip->pch_phub_extrom_base_address =\
|
|
|
|
- pci_map_rom(pdev, &rom_size);
|
|
|
|
- if (chip->pch_phub_extrom_base_address == 0) {
|
|
|
|
- dev_err(&pdev->dev, "%s: pci_map_rom FAILED", __func__);
|
|
|
|
- ret = -ENOMEM;
|
|
|
|
- goto err_pci_map;
|
|
|
|
- }
|
|
|
|
- dev_dbg(&pdev->dev, "%s : "
|
|
|
|
- "pci_map_rom SUCCESS and value in "
|
|
|
|
- "pch_phub_extrom_base_address variable is %p\n",
|
|
|
|
- __func__, chip->pch_phub_extrom_base_address);
|
|
|
|
- }
|
|
|
|
|
|
+ chip->pdev = pdev; /* Save pci device struct */
|
|
|
|
|
|
if (id->driver_data == 1) { /* EG20T PCH */
|
|
if (id->driver_data == 1) { /* EG20T PCH */
|
|
const char *board_name;
|
|
const char *board_name;
|
|
@@ -792,8 +812,6 @@ exit_bin_attr:
|
|
sysfs_remove_file(&pdev->dev.kobj, &dev_attr_pch_mac.attr);
|
|
sysfs_remove_file(&pdev->dev.kobj, &dev_attr_pch_mac.attr);
|
|
|
|
|
|
err_sysfs_create:
|
|
err_sysfs_create:
|
|
- pci_unmap_rom(pdev, chip->pch_phub_extrom_base_address);
|
|
|
|
-err_pci_map:
|
|
|
|
pci_iounmap(pdev, chip->pch_phub_base_address);
|
|
pci_iounmap(pdev, chip->pch_phub_base_address);
|
|
err_pci_iomap:
|
|
err_pci_iomap:
|
|
pci_release_regions(pdev);
|
|
pci_release_regions(pdev);
|
|
@@ -811,7 +829,6 @@ static void __devexit pch_phub_remove(struct pci_dev *pdev)
|
|
|
|
|
|
sysfs_remove_file(&pdev->dev.kobj, &dev_attr_pch_mac.attr);
|
|
sysfs_remove_file(&pdev->dev.kobj, &dev_attr_pch_mac.attr);
|
|
sysfs_remove_bin_file(&pdev->dev.kobj, &pch_bin_attr);
|
|
sysfs_remove_bin_file(&pdev->dev.kobj, &pch_bin_attr);
|
|
- pci_unmap_rom(pdev, chip->pch_phub_extrom_base_address);
|
|
|
|
pci_iounmap(pdev, chip->pch_phub_base_address);
|
|
pci_iounmap(pdev, chip->pch_phub_base_address);
|
|
pci_release_regions(pdev);
|
|
pci_release_regions(pdev);
|
|
pci_disable_device(pdev);
|
|
pci_disable_device(pdev);
|