[PATCH] ehea: 64K page support fix
This patch fixes 64k page support by using PAGE_MASK and appropriate pagesize defines in several places. Signed-off-by: Thomas Klein <tklein@de.ibm.com> Signed-off-by: Jeff Garzik <jeff@garzik.org>
This commit is contained in:
parent
07fd06b3bc
commit
a1d261c561
|
@ -238,7 +238,7 @@ static void ehea_get_ethtool_stats(struct net_device *dev,
|
||||||
data[i++] = port->port_res[0].swqe_refill_th;
|
data[i++] = port->port_res[0].swqe_refill_th;
|
||||||
data[i++] = port->resets;
|
data[i++] = port->resets;
|
||||||
|
|
||||||
cb6 = kzalloc(H_CB_ALIGNMENT, GFP_KERNEL);
|
cb6 = kzalloc(PAGE_SIZE, GFP_KERNEL);
|
||||||
if (!cb6) {
|
if (!cb6) {
|
||||||
ehea_error("no mem for cb6");
|
ehea_error("no mem for cb6");
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -92,7 +92,7 @@ static struct net_device_stats *ehea_get_stats(struct net_device *dev)
|
||||||
|
|
||||||
memset(stats, 0, sizeof(*stats));
|
memset(stats, 0, sizeof(*stats));
|
||||||
|
|
||||||
cb2 = kzalloc(H_CB_ALIGNMENT, GFP_KERNEL);
|
cb2 = kzalloc(PAGE_SIZE, GFP_KERNEL);
|
||||||
if (!cb2) {
|
if (!cb2) {
|
||||||
ehea_error("no mem for cb2");
|
ehea_error("no mem for cb2");
|
||||||
goto out;
|
goto out;
|
||||||
|
@ -586,7 +586,7 @@ int ehea_sense_port_attr(struct ehea_port *port)
|
||||||
u64 hret;
|
u64 hret;
|
||||||
struct hcp_ehea_port_cb0 *cb0;
|
struct hcp_ehea_port_cb0 *cb0;
|
||||||
|
|
||||||
cb0 = kzalloc(H_CB_ALIGNMENT, GFP_ATOMIC); /* May be called via */
|
cb0 = kzalloc(PAGE_SIZE, GFP_ATOMIC); /* May be called via */
|
||||||
if (!cb0) { /* ehea_neq_tasklet() */
|
if (!cb0) { /* ehea_neq_tasklet() */
|
||||||
ehea_error("no mem for cb0");
|
ehea_error("no mem for cb0");
|
||||||
ret = -ENOMEM;
|
ret = -ENOMEM;
|
||||||
|
@ -670,7 +670,7 @@ int ehea_set_portspeed(struct ehea_port *port, u32 port_speed)
|
||||||
u64 hret;
|
u64 hret;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
cb4 = kzalloc(H_CB_ALIGNMENT, GFP_KERNEL);
|
cb4 = kzalloc(PAGE_SIZE, GFP_KERNEL);
|
||||||
if (!cb4) {
|
if (!cb4) {
|
||||||
ehea_error("no mem for cb4");
|
ehea_error("no mem for cb4");
|
||||||
ret = -ENOMEM;
|
ret = -ENOMEM;
|
||||||
|
@ -985,7 +985,7 @@ static int ehea_configure_port(struct ehea_port *port)
|
||||||
struct hcp_ehea_port_cb0 *cb0;
|
struct hcp_ehea_port_cb0 *cb0;
|
||||||
|
|
||||||
ret = -ENOMEM;
|
ret = -ENOMEM;
|
||||||
cb0 = kzalloc(H_CB_ALIGNMENT, GFP_KERNEL);
|
cb0 = kzalloc(PAGE_SIZE, GFP_KERNEL);
|
||||||
if (!cb0)
|
if (!cb0)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
|
@ -1443,7 +1443,7 @@ static int ehea_set_mac_addr(struct net_device *dev, void *sa)
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
cb0 = kzalloc(H_CB_ALIGNMENT, GFP_KERNEL);
|
cb0 = kzalloc(PAGE_SIZE, GFP_KERNEL);
|
||||||
if (!cb0) {
|
if (!cb0) {
|
||||||
ehea_error("no mem for cb0");
|
ehea_error("no mem for cb0");
|
||||||
ret = -ENOMEM;
|
ret = -ENOMEM;
|
||||||
|
@ -1501,7 +1501,7 @@ static void ehea_promiscuous(struct net_device *dev, int enable)
|
||||||
if ((enable && port->promisc) || (!enable && !port->promisc))
|
if ((enable && port->promisc) || (!enable && !port->promisc))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
cb7 = kzalloc(H_CB_ALIGNMENT, GFP_ATOMIC);
|
cb7 = kzalloc(PAGE_SIZE, GFP_ATOMIC);
|
||||||
if (!cb7) {
|
if (!cb7) {
|
||||||
ehea_error("no mem for cb7");
|
ehea_error("no mem for cb7");
|
||||||
goto out;
|
goto out;
|
||||||
|
@ -1870,7 +1870,7 @@ static void ehea_vlan_rx_register(struct net_device *dev,
|
||||||
|
|
||||||
port->vgrp = grp;
|
port->vgrp = grp;
|
||||||
|
|
||||||
cb1 = kzalloc(H_CB_ALIGNMENT, GFP_KERNEL);
|
cb1 = kzalloc(PAGE_SIZE, GFP_KERNEL);
|
||||||
if (!cb1) {
|
if (!cb1) {
|
||||||
ehea_error("no mem for cb1");
|
ehea_error("no mem for cb1");
|
||||||
goto out;
|
goto out;
|
||||||
|
@ -1899,7 +1899,7 @@ static void ehea_vlan_rx_add_vid(struct net_device *dev, unsigned short vid)
|
||||||
int index;
|
int index;
|
||||||
u64 hret;
|
u64 hret;
|
||||||
|
|
||||||
cb1 = kzalloc(H_CB_ALIGNMENT, GFP_KERNEL);
|
cb1 = kzalloc(PAGE_SIZE, GFP_KERNEL);
|
||||||
if (!cb1) {
|
if (!cb1) {
|
||||||
ehea_error("no mem for cb1");
|
ehea_error("no mem for cb1");
|
||||||
goto out;
|
goto out;
|
||||||
|
@ -1935,7 +1935,7 @@ static void ehea_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid)
|
||||||
if (port->vgrp)
|
if (port->vgrp)
|
||||||
port->vgrp->vlan_devices[vid] = NULL;
|
port->vgrp->vlan_devices[vid] = NULL;
|
||||||
|
|
||||||
cb1 = kzalloc(H_CB_ALIGNMENT, GFP_KERNEL);
|
cb1 = kzalloc(PAGE_SIZE, GFP_KERNEL);
|
||||||
if (!cb1) {
|
if (!cb1) {
|
||||||
ehea_error("no mem for cb1");
|
ehea_error("no mem for cb1");
|
||||||
goto out;
|
goto out;
|
||||||
|
@ -1968,7 +1968,7 @@ int ehea_activate_qp(struct ehea_adapter *adapter, struct ehea_qp *qp)
|
||||||
u64 dummy64 = 0;
|
u64 dummy64 = 0;
|
||||||
struct hcp_modify_qp_cb0* cb0;
|
struct hcp_modify_qp_cb0* cb0;
|
||||||
|
|
||||||
cb0 = kzalloc(H_CB_ALIGNMENT, GFP_KERNEL);
|
cb0 = kzalloc(PAGE_SIZE, GFP_KERNEL);
|
||||||
if (!cb0) {
|
if (!cb0) {
|
||||||
ret = -ENOMEM;
|
ret = -ENOMEM;
|
||||||
goto out;
|
goto out;
|
||||||
|
@ -2269,7 +2269,7 @@ int ehea_sense_adapter_attr(struct ehea_adapter *adapter)
|
||||||
u64 hret;
|
u64 hret;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
cb = kzalloc(H_CB_ALIGNMENT, GFP_KERNEL);
|
cb = kzalloc(PAGE_SIZE, GFP_KERNEL);
|
||||||
if (!cb) {
|
if (!cb) {
|
||||||
ret = -ENOMEM;
|
ret = -ENOMEM;
|
||||||
goto out;
|
goto out;
|
||||||
|
@ -2340,7 +2340,7 @@ static int ehea_setup_single_port(struct ehea_port *port,
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
/* Enable Jumbo frames */
|
/* Enable Jumbo frames */
|
||||||
cb4 = kzalloc(H_CB_ALIGNMENT, GFP_KERNEL);
|
cb4 = kzalloc(PAGE_SIZE, GFP_KERNEL);
|
||||||
if (!cb4) {
|
if (!cb4) {
|
||||||
ehea_error("no mem for cb4");
|
ehea_error("no mem for cb4");
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -506,7 +506,7 @@ u64 ehea_h_register_rpage_mr(const u64 adapter_handle, const u64 mr_handle,
|
||||||
const u8 pagesize, const u8 queue_type,
|
const u8 pagesize, const u8 queue_type,
|
||||||
const u64 log_pageaddr, const u64 count)
|
const u64 log_pageaddr, const u64 count)
|
||||||
{
|
{
|
||||||
if ((count > 1) && (log_pageaddr & 0xfff)) {
|
if ((count > 1) && (log_pageaddr & ~PAGE_MASK)) {
|
||||||
ehea_error("not on pageboundary");
|
ehea_error("not on pageboundary");
|
||||||
return H_PARAMETER;
|
return H_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
|
@ -81,14 +81,16 @@ static inline u32 get_longbusy_msecs(int long_busy_ret_code)
|
||||||
static inline void hcp_epas_ctor(struct h_epas *epas, u64 paddr_kernel,
|
static inline void hcp_epas_ctor(struct h_epas *epas, u64 paddr_kernel,
|
||||||
u64 paddr_user)
|
u64 paddr_user)
|
||||||
{
|
{
|
||||||
epas->kernel.addr = ioremap(paddr_kernel, PAGE_SIZE);
|
/* To support 64k pages we must round to 64k page boundary */
|
||||||
|
epas->kernel.addr = ioremap((paddr_kernel & PAGE_MASK), PAGE_SIZE) +
|
||||||
|
(paddr_kernel & ~PAGE_MASK);
|
||||||
epas->user.addr = paddr_user;
|
epas->user.addr = paddr_user;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void hcp_epas_dtor(struct h_epas *epas)
|
static inline void hcp_epas_dtor(struct h_epas *epas)
|
||||||
{
|
{
|
||||||
if (epas->kernel.addr)
|
if (epas->kernel.addr)
|
||||||
iounmap(epas->kernel.addr);
|
iounmap((void __iomem*)((u64)epas->kernel.addr & PAGE_MASK));
|
||||||
|
|
||||||
epas->user.addr = 0;
|
epas->user.addr = 0;
|
||||||
epas->kernel.addr = 0;
|
epas->kernel.addr = 0;
|
||||||
|
|
|
@ -512,7 +512,7 @@ int ehea_reg_mr_adapter(struct ehea_adapter *adapter)
|
||||||
|
|
||||||
start = KERNELBASE;
|
start = KERNELBASE;
|
||||||
end = (u64)high_memory;
|
end = (u64)high_memory;
|
||||||
nr_pages = (end - start) / PAGE_SIZE;
|
nr_pages = (end - start) / EHEA_PAGESIZE;
|
||||||
|
|
||||||
pt = kzalloc(PAGE_SIZE, GFP_KERNEL);
|
pt = kzalloc(PAGE_SIZE, GFP_KERNEL);
|
||||||
if (!pt) {
|
if (!pt) {
|
||||||
|
@ -538,9 +538,9 @@ int ehea_reg_mr_adapter(struct ehea_adapter *adapter)
|
||||||
if (nr_pages > 1) {
|
if (nr_pages > 1) {
|
||||||
u64 num_pages = min(nr_pages, (u64)512);
|
u64 num_pages = min(nr_pages, (u64)512);
|
||||||
for (i = 0; i < num_pages; i++)
|
for (i = 0; i < num_pages; i++)
|
||||||
pt[i] = virt_to_abs((void*)(((u64)start)
|
pt[i] = virt_to_abs((void*)(((u64)start) +
|
||||||
+ ((k++) *
|
((k++) *
|
||||||
PAGE_SIZE)));
|
EHEA_PAGESIZE)));
|
||||||
|
|
||||||
hret = ehea_h_register_rpage_mr(adapter->handle,
|
hret = ehea_h_register_rpage_mr(adapter->handle,
|
||||||
adapter->mr.handle, 0,
|
adapter->mr.handle, 0,
|
||||||
|
@ -548,8 +548,9 @@ int ehea_reg_mr_adapter(struct ehea_adapter *adapter)
|
||||||
num_pages);
|
num_pages);
|
||||||
nr_pages -= num_pages;
|
nr_pages -= num_pages;
|
||||||
} else {
|
} else {
|
||||||
u64 abs_adr = virt_to_abs((void*)(((u64)start)
|
u64 abs_adr = virt_to_abs((void*)(((u64)start) +
|
||||||
+ (k * PAGE_SIZE)));
|
(k * EHEA_PAGESIZE)));
|
||||||
|
|
||||||
hret = ehea_h_register_rpage_mr(adapter->handle,
|
hret = ehea_h_register_rpage_mr(adapter->handle,
|
||||||
adapter->mr.handle, 0,
|
adapter->mr.handle, 0,
|
||||||
0, abs_adr,1);
|
0, abs_adr,1);
|
||||||
|
|
Loading…
Reference in New Issue