mlx4_{core, ib, en}: Fix driver when sizeof (phys_addr_t) > sizeof (long)
Some systems have PCI addresses that don't fit in unsigned long (eg some 32-bit PowerPC 440 systems have 36-bit bus addresses). Fix up mlx4 drivers by using phys_addr_t where appropriate, so we don't truncate any PCI resource addresses before ioremapping them. Signed-off-by: Roland Dreier <rolandd@cisco.com>
This commit is contained in:
@@ -1005,7 +1005,8 @@ static void *mlx4_ib_add(struct mlx4_dev *dev)
|
|||||||
if (mlx4_uar_alloc(dev, &ibdev->priv_uar))
|
if (mlx4_uar_alloc(dev, &ibdev->priv_uar))
|
||||||
goto err_pd;
|
goto err_pd;
|
||||||
|
|
||||||
ibdev->uar_map = ioremap(ibdev->priv_uar.pfn << PAGE_SHIFT, PAGE_SIZE);
|
ibdev->uar_map = ioremap((phys_addr_t) ibdev->priv_uar.pfn << PAGE_SHIFT,
|
||||||
|
PAGE_SIZE);
|
||||||
if (!ibdev->uar_map)
|
if (!ibdev->uar_map)
|
||||||
goto err_uar;
|
goto err_uar;
|
||||||
MLX4_INIT_DOORBELL_LOCK(&ibdev->uar_lock);
|
MLX4_INIT_DOORBELL_LOCK(&ibdev->uar_lock);
|
||||||
|
@@ -113,7 +113,7 @@ static void catas_reset(struct work_struct *work)
|
|||||||
void mlx4_start_catas_poll(struct mlx4_dev *dev)
|
void mlx4_start_catas_poll(struct mlx4_dev *dev)
|
||||||
{
|
{
|
||||||
struct mlx4_priv *priv = mlx4_priv(dev);
|
struct mlx4_priv *priv = mlx4_priv(dev);
|
||||||
unsigned long addr;
|
phys_addr_t addr;
|
||||||
|
|
||||||
INIT_LIST_HEAD(&priv->catas_err.list);
|
INIT_LIST_HEAD(&priv->catas_err.list);
|
||||||
init_timer(&priv->catas_err.timer);
|
init_timer(&priv->catas_err.timer);
|
||||||
@@ -124,8 +124,8 @@ void mlx4_start_catas_poll(struct mlx4_dev *dev)
|
|||||||
|
|
||||||
priv->catas_err.map = ioremap(addr, priv->fw.catas_size * 4);
|
priv->catas_err.map = ioremap(addr, priv->fw.catas_size * 4);
|
||||||
if (!priv->catas_err.map) {
|
if (!priv->catas_err.map) {
|
||||||
mlx4_warn(dev, "Failed to map internal error buffer at 0x%lx\n",
|
mlx4_warn(dev, "Failed to map internal error buffer at 0x%llx\n",
|
||||||
addr);
|
(unsigned long long) addr);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -202,7 +202,8 @@ static void *mlx4_en_add(struct mlx4_dev *dev)
|
|||||||
if (mlx4_uar_alloc(dev, &mdev->priv_uar))
|
if (mlx4_uar_alloc(dev, &mdev->priv_uar))
|
||||||
goto err_pd;
|
goto err_pd;
|
||||||
|
|
||||||
mdev->uar_map = ioremap(mdev->priv_uar.pfn << PAGE_SHIFT, PAGE_SIZE);
|
mdev->uar_map = ioremap((phys_addr_t) mdev->priv_uar.pfn << PAGE_SHIFT,
|
||||||
|
PAGE_SIZE);
|
||||||
if (!mdev->uar_map)
|
if (!mdev->uar_map)
|
||||||
goto err_uar;
|
goto err_uar;
|
||||||
spin_lock_init(&mdev->uar_lock);
|
spin_lock_init(&mdev->uar_lock);
|
||||||
|
@@ -829,7 +829,7 @@ static int mlx4_setup_hca(struct mlx4_dev *dev)
|
|||||||
goto err_uar_table_free;
|
goto err_uar_table_free;
|
||||||
}
|
}
|
||||||
|
|
||||||
priv->kar = ioremap(priv->driver_uar.pfn << PAGE_SHIFT, PAGE_SIZE);
|
priv->kar = ioremap((phys_addr_t) priv->driver_uar.pfn << PAGE_SHIFT, PAGE_SIZE);
|
||||||
if (!priv->kar) {
|
if (!priv->kar) {
|
||||||
mlx4_err(dev, "Couldn't map kernel access region, "
|
mlx4_err(dev, "Couldn't map kernel access region, "
|
||||||
"aborting.\n");
|
"aborting.\n");
|
||||||
|
Reference in New Issue
Block a user