Jesus Montero also supplied a two-run shot and Kyle Seager drove in two runs with a double for Seattle, which has won three straight on the heels of a five-game skid.
Roenis Elias (6-5) provided seven solid innings for the Mariners, conceding just one run on three hits with six strikeouts and no walks.
Rene Rivera's homer was one of just four San Diego hits. Eric Stults (2-9) was reached for four runs -- three earned -- on six hits with a walk and five strikeouts over five frames for the Padres, who have dropped three straight and eight of their last nine.
Rivera opened the scoring in the second for San Diego with a two-out blast to the second deck in left.
The Mariners went ahead in the home half. Cole Gillespie reached on a missed catch error by Padres first baseman Tommy Medica and was plated with a two-run shot to left from Montero.
Cano gave the Mariners a 4-1 lead in the fifth. James Jones got aboard with a leadoff single, stole second base and moved up to third on a wild pitch before Cano clubbed a slider over the wall in right.
Seager drove in a pair of runs with the bases loaded in the seventh off a two- out double that landed into shallow left. Mike Zunino was hit by a pitch to load the bases again, but Gillespie grounded into a force out to end the threat.